2011-09-06 3 views
0

키 조합으로 모니터를 끄고 다른 것으로 다시 끌 수있는 프로그램을 만들려고합니다. 전원 버튼이 떨어져 모니터가 거의 그대로 있습니다. SC_MONITORPOWER의 WPARAM을 사용하여 WM_SYSCOMMAND를 전송하는 것이 트릭을 수행하는 것으로 나타 났지만 사실은 그렇지 않았습니다.GetAsyncKeyState + 메시지 펌프를 사용할 수 없습니다. SC_MONITORPOWER가 완전히 작동하지 않습니다.

먼저, 내 메시지 펌프에 몇 개의 GetAsyncKeyState()를 넣으려고했지만, 실행할 때마다 키 스트로크가 선택되지 않았습니다.

while (GetMessage(&Msg, NULL, 0, 0) > 0) // main message pump 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 

    if (GetAsyncKeyState (0x31) & 0x8000) SendMessage (hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, 2); // turn monitor off if '1' is pressed 
    if (GetAsyncKeyState (0x32) & 0x8000) SendMessage (hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, -1); // turn monitor on if '2' is pressed 
    if (GetAsyncKeyState (0x33) & 0x8000) PostMessage (cmd, WM_CLOSE, 0, 0); // close console window if '3' is pressed (it even comes with the windows projects for some reason so I just hide it+deal with it 
} 

메시지 기능 전에 GetAsyncKeyState()를 옮겨 보았습니다. while (true) 루프를 사용하고 GetMessage()를 포함시켜 보았습니다.

작동을 시작한 유일한 점은 루프에서 모든 메시지 펌프 참조를 주석 처리하는 것이 었습니다. 이렇게하면 키 입력이 발생하지만 '1'(0x31)을 누르면 모니터가 켜지 기 전에 몇 초 동안 모니터가 어두워집니다 (전원 표시등이 계속 켜져 있음). LPARAM에 1의 값을 사용하여 저전력 모드로 들어가는 것도 똑같은 일을합니다. 어두울 때 '2'를 누르면 아무 것도하지 않습니다.

내 이유는 메시지 대기열을 사용하지 않아서 DefWindowProc()에서 이러한 메시지를 처리 ​​할 수 ​​없었기 때문에 잘못된 결과가 생성된다는 것입니다.

'2'를 누를 때까지 한 번에 몇 초 동안 모니터를 끈 상태로 유지하기 위해 '1'을 누를 때 루프를 설정하는 것에 대해 생각했지만 코드에 대해 충분히 나쁜 짓을 한 것으로 생각했습니다. 이미 (메시지 루프가없는 윈도우) 코드를 가지고 있다면, 나중에이 정보가 필요할 가능성이 높다.

내 윈도우 프로 시저의 모든 것은 DestroyWindow(), WM_DESTROY (숨겨진 윈도우를 보여주고 PostQuitMessage() 및 DefWindowProc)를 호출하는 WM_CLOSE입니다.

그래서 기본적으로 내 질문은 "내 메시지 펌프로 GetAsyncKeyState를 어떻게 사용할 수 있습니까?"라고되어 있습니다. 또한, 나는 WM_POWERBROADCAST도 이것을 달성 할 수있는 것으로 나타났습니다. 사용하는 것이 더 낫습니까?

편집 : 당신이 여분의 비트를 알 수 있도록 코드를 주석
편집 : RegisterHotKey() 하나의 문제를 해결하지만, 모니터가 여전히 몇 초 동안 (고체 전원 표시 등) 통조림업자로

+3

RegisterHotKey()를 사용하지 않는 이유는 무엇입니까? – tinman

+0

나는 그것을 시험해보고 그것이 어떻게 작동하는지 보게 될 것이다, 고마워. 그것은 비록 내가 펌프에서 메시지 처리를 제외하고 무엇이든 할 수 있는지 아는 것이 여전히 좋을 것이다. – chris

+0

좋아, 그 일을 얻은 후에 (내가 LOL (lParam == MOD_CONTROL) LOL (lParam == MOD_CONTROL) LOL (대괄호가 실패한 경우)가 있었음을 알게 된 후에도 정상으로 돌아 가기 전에 몇 초 동안 만 어두워진다. 관리자 권한 등 누구나 그 문제가 있었습니까? 나는 어쨌든 곧 학교에 갈 것이므로 기회가 생기면 거기에서 시도해 볼 것입니다. – chris

답변

0

말했다 어두운 간다 , RegisterHotKey을 사용하십시오.

질문에 대답하기 위해 GetAsyncKeyState은 현재 키 상태를 읽습니다. GetMessage은 대기열에있는 메시지를 읽습니다. 동기화되지 않습니다. 대신 메시지 큐와 동기화 된 GetKeyState을 사용해야합니다.

하지만 실제로는 RegisterHotKey입니다.

+0

나는 그것을 기억할 것이다. 고마워. – chris

관련 문제