2014-05-18 7 views
0

여러 확인란이 있습니다. CTRL [], ALT [], SHIFT []. checkobx가 확인되면 수정자를 추가 할 수 있습니까? 내가 무엇을 달성하고자하는의수정 자 키를 확인란에 추가하는 방법

RegisterHotKey(_hWnd, 2, (uint)fsModifiers.None, (uint)LSettings.Key_ON); 

예 : 체크 박스 CTRL [X]와 ALT [X]를 선택하는 경우 :

RegisterHotKey(_hWnd, 2, (uint)fsModifiers.Control | (uint)fsModifiers.Alt, (uint)Keys.S); 

난 내가 7 IF를 사용할 수 있습니다 알고 있지만, 그것은 것 매우 지저분합니다. 사용자가 Ctrl 키를 누른 상태에서 Alt 키와 Shift 키 또는 키 키를 사용할지 여부를 확인할 수 있기 때문입니다. 나는 심지어 어떤 배열을 가지고 시도했지만, 이것을 어떻게 해결해야할지 모른다. 그것은 여러이나 문제가 있다면

+0

무엇이 오류입니까? 'fsModifiers'는 어떻게 정의되어 있습니까? – MarcinJuraszek

+0

동일한 ID로 새 핫 키를 생성하기 전에 이전 핫키의 등록을 취소해야합니다. (적어도 최신 Windows 버전에서는 7 또는 8을 사용하고 있다고 가정합니다.) –

+0

이전 단축키를 등록 취소해도 문제가되지 않습니다. 배열을 만드는 방법이나 7x IF를 사용하지 않고 배열을 만드는 방법을 알고 싶습니다. 나는 뉴욕 에로스를 얻지 못한다. 어떻게하면 두 번째 코드가 내가 성취하고자하는 것을 보여주는 예일 수 있을까? – JayJay

답변

1

코드를 불필요하게 복잡하게 만들지 마십시오. 그냥이를 좋아합니까 : 등

RegisterHotKey(_hWnd, 
       2, 
       (chkCtrl.Checked  ? fsModifiers.Ctrl : 0) 
       | (chkAlt.Checked ? fsModifiers.Alt : 0) 
       | (chkShift.Checked ? fsModifiers.Shift : 0) 
       | (chkWin.Checked ? fsModifiers.Win : 0), 
       (uint)Keys.S); 

chkCtrl, 당신의 체크 박스 컨트롤의 이름입니다.

fsModifiers 값을 uint로 전송하는 이유를 알 수 없습니다. 내 코드에서 해당 캐스트를 제거했습니다. 문 "IF"

enum fsModifiers : uint 
{ 
    Alt  = 0x0001, 
    Ctrl  = 0x0002, 
    Shift = 0x0004, 
    Win  = 0x0008, 
    NoRepeat = 0x4000, 
}; 

예, 당신이이 방법을 효과적으로 4를 가지고 : 당신이 단위 값을 전달할 수 있도록 싶은 경우에, 단지 열거 그런 식으로 선언합니다. 조건 연산자는 "IF"문을 작성한 것과 똑같은 일리노이로 컴파일됩니다. 그러나이 경우 읽기 쉽습니다.

비트 배열을 사용하여이 논리를 다시 작성하는 복잡한 방법을 찾는 것은 실제 성능 이점이 없습니다. 병목 현상은 RegisterHotKey 함수에 전달할 매개 변수를 계산하는 논리가 아니며 RegisterHotKey 함수에 대한 실제 호출이됩니다. 컴파일러 나 JIT 컴파일러가 이것을 최적화 할 수있는 방법이 없습니다. 시스템 DLL에있는 외부 함수를 P/호출하는 것입니다. 속도가 느립니다 (상대적으로 말하자면, 여전히 응용 프로그램의 성능 문제는 아닙니다).

그리고 개인적으로 나는 이 로직을 복잡하게 만드는 가독성 (따라서 유지 관리비)이들 것이라고 생각합니다. 위의 코드를 사용하면 기본적인 프로그래밍 지식을 가진 사람이 어떤 일이 일어나고 있는지 파악할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 이것은 훌륭한 솔루션이지만 여전히 코드에 문제가 있습니다.** 운영자 | int 및 bool 유형의 피연산자에는 적용 할 수 없습니다. chkCtrl.Checked? fsModifiers.Ctrl : 0 | 알았어. 확인 됐어? fsModifiers.Alt : 0 | chkShift. 확인 됐어? fsModifiers.Shift : 0 | chkWin.Checked? fsModifiers.Win : 0, – JayJay

+0

좋습니다 (()를 추가해야합니다) : ((cbox.cbTOGGLE_ON_CTRL.Checked? (uint) fsModifiers.Control : (uint) fsModifiers.None) | (cbox.cbTOGGLE_ON_CTRL.Checked? (uint) fsModifiers.Control : (uint) fsModifiers.None)), (uint) Keys.S); – JayJay

+0

예, 항상 괄호를 추가하는 것이 좋습니다. 코드를 먼저 컴파일하려고하지 않을 때 그런 것들을 거의 놓치지 마십시오. 분명히 나는 ​​암기 된 연산자 연관성 규칙을 가지고 있지 않다. 내 대답이 업데이트되었습니다. –

0

는 다음을 시도 할 수 있습니다 :

Dim Dipswitch as boolean() 'a single array of boolean 
If DipSwitch(0) Then DoA 
If DipSwitch(1) Then DoB 
If DipSwitch(2) Then DoC 
If DipSwitch(3) And Not DipSwitch(4) Then DoD 

등 태그는 다음 수 "0011"같은 것을. Dipswitch 3 및 4의 상황 희망 사항 귀하의 질문을 잘 이해하고 있습니다.

+0

답장을 보내 주셔서 감사합니다,하지만 그게 C#에 advenced 아니에요. 나는 이것에 대해 읽고 그것을 독자적으로 알아 내려고 할 것이다. 나는 그것을 사용할 수 있다면 대답을 해결로 표시 할 것이다. – JayJay