2010-01-29 3 views
0

부모 내에서 최대화 된 자식 창이 있습니다.Windows 7의 EnableWindow 이후 SendInput

키를 누를 때까지 입력을받지 않도록 비활성화해야합니다. 예를 들어 키 'A'를 누르면 자식 창을 활성화하고 SendInput()으로 보낸 입력을 받고 다시 비활성화 할 수 있습니다.

그래서 나는이 작업을 수행 : 창은 입력의 일부를 벗어났습니다 제외
EnableWindow(hwnd, TRUE); 
SetForegroundWindow(hwnd); 
SetFocus(hwnd); 
Sleep(50); 

SendInput()...x7-8 times 

EnableWindow(hwnd, FALSE); 

지금, EnableWindow의 기능은 잘 작동합니다. 나는 EnableWindow (6-7 초 같은 !!) 후에 약간의 지연을 두려고 노력했다. 그리고 아직도 올바르게 작동하지 않는다.

프레임을 업데이트하도록 SetWindowPos()를 시도했지만 WS_DISABLE 비트를 수동으로 설정했지만 여전히 운이 좋았습니다. 자식 창을 항상 사용할 수 있으면 입력이 제대로 작동합니다.

도움을 주시면 감사하겠습니다.

+0

수면은 SetForegroundWindow입니다. –

답변

2

자식 창은 부모 창과 동일한 스레드에서 처리됩니다. 따라서 SendInput은 펌프를 다시 사용하지 않고 이벤트를 처리하지 않는 한 아무런 효과가 없습니다.

달성하려는 내용을 설명하면 더 나은 방법을 제시 할 수 있습니다. 그러나 어떤 경우 든 적어도 이벤트가 끝날 때까지 SendEvents 다음에 메시지 펌프를 실행해야합니다.

펌프가 일 수도 있고 펌프가 다른 메시지를 펌프하므로 전체 디자인을 뒤엎을 수 있습니다. 그러나 여기 있습니다.

// process messages until the queue is empty. 
// 
MSG msg; 
while (PeekMessage(&msg, NULL, 0, PM_REMOVE)) 
{ 
    // make sure we don't eat the quit message. 
    if (WM_QUIT == msg.message) 
    { 
     PostQuitMessage(); 
     break; 
    } 

    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

아, 그리고 Sleep()은 아무 것도 유용하지 않습니다. 당신은 그것을 꺼낼 수 있습니다.

편집 :이 코드는 SendInput 호출 이후이고 창을 사용할 수 없게되기 전에 수행됩니다. SendInput 전에 창이 안정화되도록하려면 Sleep() 대신 사용하십시오.

+0

수면()을 꺼내면 간신히 작동합니다. 이후 입력되는 대부분의 입력은 창에 초점이 맞춰 지거나 엉망이되기 전에 전송됩니다. 나머지는 앞서 말한 것입니다. –

0

SendInput 대신 키보드 또는 마우스 메시지를 하위 창에 직접 보내 봅니다. 예 :

EnableWindow(hwnd, TRUE); 

SendMessage(hwnd, WM_KEYDOWN, ..., ...); 
SendMessage(hwnd, WM_KEYUP, ..., ...); 
// etc... 

EnableWindow(hwnd, FALSE);