2013-06-11 115 views
0

我正在構建一個程序,可以在屏幕上打印按下按鈕的值。當程序的窗口不活動時,我也需要它。我嘗試使用GetAsyncKeyState(int),它工作正常。但是,我可以將某些字符串附加到鍵上,但不適用於所有類型的鍵盤(例如,在英文鍵盤上shift + 2是@,而在我的鍵盤上則不是)。如何檢測由Windows完成的鍵輸入的後處理(在記事本中寫入時在屏幕上打印的字符)?在窗口識別鑰匙後檢測鍵盤輸入

+1

你可能想設置一個windows鍵盤鉤子。 –

+0

爲什麼你的程序需要這樣做?它是一個IME嗎?屏幕上的鍵盤?鍵盤記錄器? IME有特殊的接口可以做到這一點。屏幕上的鍵盤通常不會顯示結果鍵(它顯示在目標應用程序中)。 –

+0

Jerry Coffin>感謝您的建議。看起來好像會起作用,但是,實現起來並不容易。任何代碼示例? – Stein

回答

0

嘗試使用OemKeyScan功能。隨着你的,你應該有scancode(例如「2」鍵具有給定的掃描碼,就是始終取決於所處的位置在鍵盤上相同的,例如17的「2」鍵):

int whichscancode= 17; 
    if (key_with_shift) 
     whichscancode|= (1<<16); // shifted values with 1<<16 

    for (i=0; i<256; i++) { 
      int scan= ::OemKeyScan(i); // try all characters for a matching scancode 
      if (scan==whichscancode) { 
       // i here is the ascii code of the key on that position 
       printf("on that scancode is character %c\n", (char)i); 
      } 
    } 
+0

好的,我得到的掃描碼在所有鍵盤上都是一樣的。它可以工作,但我怎樣才能將它與GetAsyncKeyState(int)一起使用,它將虛擬鍵作爲輸入?如果我在任何鍵盤上輸入符號「@」,無論是shift + 2還是shift +,它都會給我「@」。 – Stein