就像標題一樣,它是關于 win32api 虛擬鍵碼的
請參閱:https ://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
我需要將條目中的字母轉換為它的虛擬鍵碼。如果輸入值是 A,我們需要將其轉換為 0x41,如果是 B,如果是 C 0x43 等,則將是 0x42。它也可以與 Shift、Ctrl 或 Alt 一起使用(這不僅適用于字母)。我的問題是我不知道如何根據條目中的 Key 獲取他們的虛擬鍵代碼。
例如,這里有一個值為 U 的條目,我們應該獲得 U 的虛擬鍵代碼 => 0x55
所以當我們點擊key的時候,win32api的GetKeyState()會檢測到它(因為它的格式是0x0...),然后在pyautogui的幫助下點擊一下。
絕對有必要將輸入的值轉換為虛擬鍵代碼才能使 GetKeyState 使用
編輯:
if win32api.GetKeyState(win32api.VkKeyScan('alt')) < 0:
但它回傳=>
if win32api.GetKeyState(win32api.VkKeyScan('ctrl')) < 0: TypeError: must be a unicode string of length 1
如果它只適用于一個不太好的字母......如果數字鍵盤數字或其他數字與鍵碼相同但不是特定字母的鍵必須作業,這不是問題......
uj5u.com熱心網友回復:
從 [SO] 粘貼:如何將 Entry 中的值轉換為 win32api 虛擬鍵代碼?(@CristiFati 的回答)(出于某種原因,您洗掉了該問題)。
如果你想要一個char -> 鍵碼映射,你可以:
手動創建一個(使用[MS.Docs]: Virtual-Key Codes中的串列)
使用[MS.Docs]: VkKeyScanW function (winuser.h) (也可以檢查[MS.Docs]: MapVirtualKeyW function (winuser.h) out)
需要注意的重要事項:
多個鍵可以產生相同的虛擬鍵碼(例如 1and NumPad 1)
沒有組合鍵碼,因此對于一個字符(同時按下Shift, Alt,時Ctrl)將有超過 1 個
代碼00.py:
#!/usr/bin/env python
import sys
import win32api as wapi
import win32con as wcon
def vks(c):
ret = []
res = wapi.VkKeyScan(c)
ss = (res >> 8) & 0xFF
if ss & 0x01:
ret.append(wcon.VK_SHIFT)
if ss & 0x02:
ret.append(wcon.VK_CONTROL)
if ss & 0x04:
ret.append(wcon.VK_MENU)
ret.append(res & 0xFF)
return tuple(ret)
def main(*argv):
print("Sample key values:")
print(["0x{:02X} ({:d})".format(e, e) for e in (wcon.VK_SHIFT, wcon.VK_CONTROL, wcon.VK_MENU, ord("y"), ord("Y"))])
print("\nScan cdess:")
for c in (
"y",
"Y",
"\x79",
"\x59",
"\x19",
):
print(vks(c))
if __name__ == "__main__":
print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
64 if sys.maxsize > 0x100000000 else 32, sys.platform))
rc = main(*sys.argv[1:])
print("\nDone.\n")
sys.exit(rc)
輸出:
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q073840049]> "e:\Work\Dev\VEnvs\py_pc064_03.09_test0\Scripts\python.exe" ./code00.py Python 3.9.9 (tags/v3.9.9:ccb0e6a, Nov 15 2021, 18:08:50) [MSC v.1929 64 bit (AMD64)] 064bit on win32 Sample key values: ['0x10 (16)', '0x11 (17)', '0x12 (18)', '0x79 (121)', '0x59 (89)'] Scan cdess: (89,) (16, 89) (89,) (16, 89) (17, 89) Done.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510145.html
