2014-01-17 149 views
5

documentation它說:keybd_event KEYEVENTF_EXTENDEDKEY解釋需要

KEYEVENTF_EXTENDEDKEY(0×0001):如果指定,掃描碼是由具有值0xE0(224)的前綴字節之後。

有人可以解釋這是什麼意思?

是什麼這之間的區別:和

keybd_event(RIGHT, 0, 0, 0); 
keybd_event(RIGHT, 0, 2, 0); 

這樣的:

keybd_event(RIGHT, 0, 1 | 0, 0); 
keybd_event(RIGHT, 0, 1 | 2, 0); 

,因爲當我執行這個代碼,我看不出沒有什麼區別?

另外,什麼是「字節bScan」?在描述中是:密鑰的硬件掃描碼。那意味着什麼?

回答

2

簡單的(和不完整的)的解釋是,KEYEVENTF_EXTENDEDKEY意思是「這個按鍵是數字鍵」

由於大多數程序的行爲相同的,如果你按「1」的「Q」鍵的上方,因爲他們做的時候你在數字鍵盤(這是一個擴展鍵)上點擊'1' - 當你模擬鍵盤輸入時你設置這個標誌時通常不會看到任何不同。

注意位置的程序通常會響應此標誌。

bScan值是原始硬件掃描碼。有關掃描碼的解釋,請看http://en.wikipedia.org/wiki/Scancode。像擴展密鑰標誌一樣,大多數程序都不關注掃描碼。如果程序想把鍵盤當作一堆按鈕,那麼值就在那裏。

+0

非常感謝你爲這個偉大的解釋。現在對我來說更加清楚了。另外,我在哪裏可以得到關於EXTENDEDKEY的完整說明,有沒有一些文章? – mgulan

+1

這個答案是錯誤的。我不明白爲什麼人們投票回答是完全錯誤的?擴展標誌與鍵盤完全無關。需要此標誌的鍵盤上唯一的鍵是VK_DIVIDE和VK_NUMLOCK。另一方面,還有其他鍵需要這個標誌,並且完全不需要使用像VK_LWIN或VK_RIGHT或VK_VOLUME_DOWN這樣的小鍵盤。在這裏看到我的答案。 – Elmue

+1

這個答案缺少。這與數字鍵盤本身無關。 [閱讀](https://msdn.microsoft.com/en-us/library/ms646267%28v=vs.85%29.aspx)或我的評論 – Carol

11

這是原始IBM PC上鍵盤佈局的古老實現細節。這是該鍵盤是什麼樣子早在1981年:

enter image description here

看起來並不像鍵盤今天的樣子。這個演變的額外鍵被添加爲像專用光標鍵和空格鍵右側的Ctrl和Alt鍵。爲了使它與直接讀取鍵盤的現有軟件兼容(當時非常普遍的犯罪),鍵盤控制器將這些擴展的鍵報告給相同的掃描碼,但在其之前有一個額外的特殊字節。因此,右側的Ctrl和Alt鍵與左側的Ctrl鍵和Alt鍵的工作方式相同,如果程序關心區別,則可以檢測與前綴字節的差異。 0xE0是該前綴。

許多程序不關心你按下哪個特定的鍵,他們只是使用虛擬鍵碼而不關心它是否是擴展鍵。就像那些舊的MS-Dos程序沒有。這就是爲什麼你沒有看到差異。並且由於您沒有指定掃描碼,所以不能有所作爲。來自Microsoft的詳細文檔描述了鍵盤掃描代碼是available here

+0

這也是一個很好的答案。謝謝。 – mgulan

+0

也是這個答案是錯的。爲什麼人們選錯答案?標誌KEYEVENTF_EXTENDEDKEY對於keybd_event()很重要,並且必須正確設置。關心這個標誌是必要的,否則鍵盤注入將失敗。在這裏看到我的答案。 – Elmue

6

這裏的兩個答案都是錯誤的。 我不明白爲什麼人們選錯了答案?

這兩個答案都表明該標誌是無關緊要的。這是完全錯誤的。國旗與鍵盤沒有任何關係。

正確的答案是,目前只有掃描碼01至7F的虛擬鍵從01到FF的範圍。

因此,作爲鍵盤長大成爲必要,一些掃描碼有雙重任務。例如,在我的鍵盤上,掃描碼0x45被分配給NumLock鍵和Pause鍵。

爲了區分他們keyborard發送擴展主要標誌的NumLock鍵而不是爲暫停鍵。

還有其他幾個鍵具有雙分配,例如所有媒體鍵。

運行間諜++自帶的Visual Studio工具和過濾器僅WM_KEYDOWN並啓用「解碼消息參數」,然後打在文本編輯器的一些按鍵。

間諜++會告訴你爲此鍵設置了標誌和其鍵沒有設置。

在這裏從間諜++輸出:

P WM_KEYDOWN nVirtKey:VK_NUMLOCK cRepeat:1 ScanCode:45 fExtended:1 fAltDown:0 fRepeat:0 fUp:0 
P WM_KEYDOWN nVirtKey:VK_PAUSE cRepeat:1 ScanCode:45 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 

另一個例子是被分配給字母「C」和我的鍵盤上VK_VOLUME_DOWN掃描碼2E。

必須完全相同的方式進行編程,否則因爲另一個關鍵是打比你預期的一個鍵盤注射keybd_event()將失敗。

不是信任MapVirtualKeyEx(MAPVK_VK_TO_VSC_EX)(> = Vista),因爲它不返回某些鍵的擴展標誌,儘管它們是擴展鍵,例如VK_LEFT。該函數的另一個缺陷是它返回了VK_PAUSE鍵的擴展標誌(E1),儘管這個鍵沒有被擴展。

+1

[要從中添加](https://msdn.microsoft.com/en-us/library/ms646267%28v=vs.85%29.aspx):_The擴展密鑰標誌指示按鍵消息是否源自增強型鍵盤上的其他鍵。擴展鍵由鍵盤右側的ALT和CTRL鍵組成; INS,DEL,HOME,END,PAGE UP,PAGE DOWN和方向鍵在數字鍵盤的左側; NUM LOCK鍵; BREAK(CTRL + PAUSE)鍵; PRINT SCRN鍵;和數字鍵盤上的分隔符(/)和ENTER鍵。如果密鑰是擴展密鑰,則會設置擴展密鑰標記_ – Carol

+0

我不知道爲什麼要在此處發佈此文本?這是一個非常古老的描述(從Windows 95時代開始),它不再是最新的。這是不正確的。還有更多的擴展鍵比你在發佈中列舉的更多,例如所有不在鍵盤右側的媒體鍵。 – Elmue

+0

我認爲它仍然會添加到您的帖子中,如果您有更新的內容顯示所有擴展密鑰,請繼續。 – Carol