FindWindow и SendMessage

Я пытаюсь понять, почему это не отправляет ALT + F в блокнот,

Private Declare Function FindWindow1 Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const WM_KEYUP = &H101
Private Const WM_KEYDOWN = &H100
Private Const WM_SYSKEYDOWN = &H104

Private Sub Command_Click()
Dim parenthwnd As Long
Dim hwnd As Long

  parenthwnd = FindWindow1(vbNullString, "Untitled - Notepad")
  retvalue = SendMessage(parenthwnd, WM_SYSKEYDOWN, VK_MENU, 1&)
  retvalue = SendMessage(parenthwnd, WM_KEYDOWN, VK_F, 1&)
End Sub

Я получаю значение для parenthwnd, но не для любого из значений retvalue (0).

Что мне не хватает?


person StealthRT    schedule 25.10.2010    source источник
comment
Кто-нибудь еще хочет попробовать это?   -  person StealthRT    schedule 26.10.2010


Ответы (3)


Вы можете попробовать отправить/опубликовать эти сообщения сколько угодно. К сожалению, они не влияют на возвращаемое значение GetAsyncKeyState, которое система использует при обработке сообщения VK_F, чтобы увидеть, не работает ли альт.

В результате вы не можете подделывать нажатия клавиш с модификаторами для других приложений, использующих этот механизм.

Чтобы обойти это, вам нужно использовать SendInput - но для этого требуется, чтобы приложение для приема нажатий клавиш было окном переднего плана/фокуса.

person Chris Becke    schedule 16.11.2010
comment
Или попробуйте инструкцию VB6 SendKeys - person MarkJ; 21.12.2011

Я думаю, что это проблема: вы отправляете свое сообщение в рамку вокруг окна блокнота, и вам нужно отправить его в окно меню. Используйте свой дескриптор с FindWindowEx и имя класса 32768 (это меню), чтобы получить окно меню, которое является дочерним элементом того, к которому у вас есть дескриптор. Вот две страницы: http://msdn.microsoft.com/en-us/library/ms633500(v=VS.85).aspx и http://msdn.microsoft.com/en-us/library/ms633574(VS.85).aspx#class_name это должно помочь.

person BobRodes    schedule 28.10.2010

Используйте Postmessage вместо Sendmessage

Public Const WM_SYSKEYDOWN = &H104

PostMessage hwnd, WM_SYSKEYDOWN, vbKeyF, 2 ^ 29 

'Simulates Alt + F (2^29 sets the 29 bit of lParam indicating Alt is being pressed.
person Cidtek    schedule 25.10.2010