2012-06-22 139 views
0

我想用winapi做一個簡單的文本編輯器,它的工作原理是簡單的,但它不適用於大寫字母或shift鍵。使用Winapi鍵盤輸入

char keys[256]; 
int  x = 0; 
while (1) 
{ 
    for (x = 0; x <= 256; x++) 
    { 
     if (GetAsyncKeyState(x) == -32767) 
      { 
       char c[5]; 
       GetKeyboardState(keys); 
       ToAscii(x, MapVirtualKey(x, 0), keys, c, 0); 
       putchar(c[0]); 
      } 
     } 
} 

回答

0

嘗試調用

GetKeyState(VK_CAPITAL); 

GetKeyboardState(keys); 
+0

好吧,它的工作可以解釋我爲什麼? – gfauchart

+0

這是[這裏](http://www.gamedev.net/topic/484351-virtual-key-vs-ascii-key/) –

1

鍵盤輸入的行爲比您想象的複雜得多。您的方法不起作用,因爲:

  1. GetAsyncKeyState可能會遺漏密鑰。當用戶在兩次通話之間敲擊一個鍵時會發生什麼?
  2. 按住一個鍵時會發生什麼?鍵盤重複怎麼樣?
  3. 最重要的是,您的代碼假定鍵和字符之間的關係爲1:1。您沒有任何機制來處理組合,如移位/大寫鎖定狀態或死鎖。

如果你試圖解釋你想要做什麼,那麼會更好,你可以通過正確的方式獲得建議。試圖重新發明這種基本輸入設備的行爲不太可能是最好的方法。

+0

我試圖做一個文本編輯器像記事本。 但不是使用ToAscii我可以讓我自己的解釋像VK_SHIFT + 0x41做一個'A'...但是我會不同於azerty和qwerty吧? – gfauchart

+0

如果您正在編寫自己的編輯器控件,則應該使用消息循環並處理'WM_CHAR'。 'TranslateMessage'基於鍵盤活動生成此消息;你不應該試圖重新發明這個輪子。 – tenfour

1

GetAsyncKeyState可能是沒有辦法的辦法去這裏:真正的方法,使一個文本編輯器類型的控制,而不是處理WM_KEYDOWN和WM_CHAR消息。當HWND專注時,Windows會將這些發送到您的WndProc。這是Windows EDIT和RichEdit控件使用的技術。

使用WM_KEYDOWN來處理非字符鍵 - 如箭頭(VK_LEFT,VK_RIGHT),向上翻頁等;並使用WM_CHAR作爲文本字符。 WM_KEYDOWN告訴你使用VK_值按下的鍵,並且不考慮移位狀態;而WM_CHAR確實處於轉換狀態,因此給出'A'對'a'或'1'對'!'作爲適當的。 (請注意,必須在消息循環中爲此發生TranslateMessage。)

說了這麼多之後,要做的更簡單/更好的事情就是使用現有的Windows EDIT或RichEdit控件並讓它們執行爲你工作 - 很少有充分的理由重新發明車輪 - 除非你玩的樂趣和學習Win32也許。編寫適當的文本編輯器非常複雜;有很多非明顯的東西需要考慮,特別是當你進入非英語文本時:你需要確保它能夠正確地使用從右到左的文本(阿拉伯語,希伯來語),與IME一起使用,這些習慣用於輸入日文和中文字符。而且您必須確保屏幕閱讀器可以訪問您的控件,以便具有視覺障礙的用戶仍然可以使用該控件。編輯和RichEdit爲你做這一切。

例如,實際的記事本應用程序只是EDIT控件的包裝;而寫字板只包裝RichEdit控件;都可以讓控件完成所有艱苦的工作,並且只需在頂部添加額外的UI和文件保存/加載功能即可。