Отправка PostMessage WM_KEYDOWN / UP в блокнот редактирования редактора работает с VK_F5, но не с обычной буквой - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь отправить 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
...