Я пытаюсь отправить WM_KEYDOWN и WM_KEYUP в блокнот редактирования блокнота. Следующий пример работает, если я отправляю VK_F5
: Блокнот вставляет текущую дату и время. Однако, если я пытаюсь отправить простое h
, блокнот не прекращает вставлять один h
за другим, поэтому мне приходится убивать блокнот с помощью диспетчера задач.
Я не понимаю, почему он работает с одним ключом, а не с другим, и я хотел бы знать, что мне нужно изменить, чтобы отправить простое письмо.
option explicit
const WM_KEYDOWN = &h0100
const WM_KEYUP = &h0101
const VK_F5 = &h074
declare function FindWindow lib "user32" alias "FindWindowA" ( _
byVal lpClassName as string, _
byVal lpWindowName as string) as long
declare function FindWindowEx lib "user32" alias "FindWindowExA" ( _
byVal hWnd as long , _
byVal hWndChildAfter as long , _
byVal lpClassName as string, _
byVal lpWindowName as string) as long
declare function MapVirtualKey lib "user32" alias "MapVirtualKeyA" ( _
byVal wCode as long, _
byVal wMapType as long) as long
declare function PostMessage lib "user32" alias "PostMessageA" ( _
byVal hwnd as long, _
byVal wMsg as long, _
byVal wParam as long, _
lParam as any) as long
declare function ShellExecute Lib "shell32.dll" alias "ShellExecuteA" ( _
byVal hwnd as long , _
byVal lpOperation as string, _
byVal lpFile as string, _
byVal lpParameters as string, _
byVal lpDirectory as string, _
byval lpShowCmd as long) as long
declare sub Sleep lib "kernel32" (byVal dwMilliseconds as long )
sub main()
dim hWndNotepad as long
dim hWndNotepadEdit as long
'
' Start notepad
'
ShellExecute 0, "Open", "notepad.exe", "", "", 1
'
' Find the window handle for notepad
'
hWndNotepad = FindWindow("notepad", vbNullString)
while hWndNotepad = 0
'
' Wait a while if notepad window not yet initialized:
'
Sleep 100
hWndNotepad = FindWindow("notepad", vbNullString)
wend
'
' Find the window handle of the edit control
' in notepad:
'
hWndNotepadEdit = FindWindowEx(hWndNotepad, 0, "Edit", vbNullString)
dim vkCode as long
' This works:
' ----------
'
' vkCode = VK_F5
'
' This doesn't:
' ------------
vkCode = asc("H")
dim lParam as long
lParam = 1 + MapVirtualKey(vkCode, 0) * 2^16
PostMessage hWndNotepadEdit, WM_KEYDOWN, vkCode, lParam
Sleep 100
PostMessage hWndNotepadEdit, WM_KEYUP , vkCode, lParam or &hc0000000
end sub