嘿所有我想弄清楚为什么这不是给记事本发送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)。
我缺少什么?
大卫
答案 0 :(得分:2)
您可以尝试发送/发布这些消息。不幸的是,它们不会影响GetAsyncKeyState的返回值 - 这是系统在处理VK_F消息时使用的,以查看alt是否已关闭。
因此,您无法使用此机制伪造带有修饰符的键击到其他应用程序。
要解决此问题,您需要使用SendInput - 但这需要接收击键的应用程序是前景/焦点窗口。
答案 1 :(得分:1)
使用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.
答案 2 :(得分:1)
我认为这是问题所在:您将消息发送到记事本窗口周围的框架,并需要将其发送到菜单窗口。使用带有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应该有所帮助。