2015-09-07 33 views
0

我正在寫的一個GUI應用程序確實發送了一個keydown事件到另一個窗口cmd.exe爲什麼從全局熱鍵處理程序中調用PostMessage時無效?

PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0); 

該事件時,它的對事件做這樣WM_CREATEWM_KEYUP等(新線出現在cmd.exe)發送就好了。

然後我用RegisterHotKey設置了一個全局熱鍵。在WM_HOTKEY處理程序中,我成功接收了按鍵,但PostMessage已無效。

如何解決這個問題?

完整的示例,精縮地:

#include <iostream> 
#include <Windows.h> 

using namespace std; 

const char g_szClassName[] = "myWindowClass"; 

BOOL CALLBACK enumWindows(HWND hwnd, LPARAM lParam) { 
    char winTitle[1024*10]; 
    GetWindowText(hwnd, winTitle, sizeof(winTitle)); 
    if (strstr(winTitle, "cmd.exe") != NULL) { 
     cout << "Sending a message to window " << hwnd << ": " << winTitle << endl; 
     PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0); 
    } 
    return TRUE; 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { 
    switch(msg) { 
     case WM_CREATE: 
      // register hotkey ctrl+alt+s 
      RegisterHotKey(hwnd, 100, MOD_ALT | MOD_CONTROL, 'S'); 
      break; 
     case WM_CLOSE: 
      DestroyWindow(hwnd); 
      break; 
     case WM_DESTROY: 
      EnumWindows(enumWindows, 0); 
      PostQuitMessage(0); 
      break; 
     case WM_HOTKEY: 
      // hotkey ctrl+alt+s fired 
      EnumWindows(enumWindows, 0); 
      break; 
     case WM_KEYUP: 
      EnumWindows(enumWindows, 0); 
      break; 
     default: 
      return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

// just init stuff, do not waste your time 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
    WNDCLASSEX wc; 
    HWND hwnd; 
    MSG Msg; 

    wc.cbSize  = sizeof(WNDCLASSEX); 
    wc.style   = 0; 
    wc.lpfnWndProc = WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance  = hInstance; 
    wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = g_szClassName; 
    wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 

    RegisterClassEx(&wc); 
    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, g_szClassName, "Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL); 
    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 

    while(GetMessage(&Msg, NULL, 0, 0) > 0) { 
     TranslateMessage(&Msg); 
     DispatchMessage(&Msg); 
    } 
    return Msg.wParam; 
} 

的Windows 7 64位

+0

也許'WM_KEYDOWN'處理程序檢查其他鍵的狀態,這是在瞬間的熱鍵火災鬱悶? –

+0

僞造輸入,並做錯了,是的,錯了。使用官方自動化界面可能會取得更好的成功:[UI自動化](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx)。 – IInspectable

回答

4

雷蒙德陳已記錄爲什麼這不工作,你所期望的方式(PostMessage是工作得很好,但其他窗口的響應取決於實際的鍵盤狀態,就像我在我的評論中所猜測的那樣)。見他的博客: