2009-01-30 45 views
2

我正在嘗試更改我的鍵盤發送給應用程序的鍵。我已經創建了一個全局鉤子,可以阻止我想要的密鑰,但是我現在想要發送一個新的密鑰。這裏是我的鉤PROC:如何模擬按鍵到當前聚焦的窗口?

LRESULT __declspec (dllexport) HookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    int ret; 

    if(nCode < 0) 
    { 
     return CallNextHookEx(hHook, nCode, wParam, lParam); 
    } 

    kbStruct = (KBDLLHOOKSTRUCT*)lParam; 

    printf("\nCaught [%x]", kbStruct->vkCode); 

    if(kbStruct->vkCode == VK_OEM_MINUS) 
    { 
     printf(" - oem minus!"); 
     keybd_event(VK_DOWN, 72, KEYEVENTF_KEYUP, NULL); 
     return -1; 
    } 
    else if(kbStruct->vkCode == VK_OEM_PLUS) 
    { 
     printf(" - oem plus!"); 
     keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL); 
     return -1; 
    } 

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

我使用的SendMessage和PostMessage的與GetFocus()和GetForegroudWindow()嘗試過,但無法弄清楚如何創建WM_KEYUP或WM_KEYDOWN的LPARAM。我也嘗試了keybd_event(),它可以模擬鍵(我知道,因爲這個鉤子程序捕獲了模擬按鍵),包括5或6個不同的掃描代碼,但是沒有影響我的前景窗口。

我基本上試圖把我的ms3200上的縮放欄變成滾動控件,所以我甚至可能會發送錯誤的按鍵(向上和向下)。

回答

2

調用keybd_event是正確的。如果你所做的只是一個關鍵,那麼也許該窗口會處理關鍵信息。你真的需要通過一鍵發送往下依次關鍵了:

keybd_event(VK_UP, 75, 0, NULL); 
keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL); 

或者,更好的是,發送鍵按下時,OEM密鑰下降和鍵起來的時候OEM密鑰上升。您可以通過kbStruct-> flags & LLKHF_UP來告訴down/up狀態。

0

您可能想嘗試Control-UpArrow和Control-DownArrow而不是Up和Down。然而,這似乎並不適用於所有應用程序,即使在應用程序可以工作的情況下,也可能取決於重點在哪裏。

相關問題