我试图弄清楚为什么它没有向记事本发送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)。
我想念什么?
您可以尝试根据需要发送/发布这些消息。不幸的是,它们不会影响GetAsyncKeyState的返回值(这是系统在处理VK_F消息时使用的返回值),以查看alt是否关闭。
因此,您不能使用此机制将带有修饰符的击键伪造到其他应用程序。
要解决这个问题,您需要使用SendInput-但这要求接收击键的应用程序是前景/焦点窗口。
我认为这是问题所在:您正在将消息发送到记事本窗口周围的框架,并且需要将其发送到菜单窗口。使用带有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。
使用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.