1

我试图弄清楚为什么这没有向记事本发送 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)。

我错过了什么?

4

3 回答 3

2

您可以尝试随心所欲地发送/发布这些消息。不幸的是,它们不会影响 GetAsyncKeyState 的返回值 - 这是系统在处理 VK_F 消息时使用的 - 以查看 alt 是否关闭。

因此,您不能使用此机制将带有修饰符的击键伪造给其他应用程序。

为了解决这个问题,您需要使用SendInput - 但这要求接收击键的应用程序是前景/焦点窗口。

于 2010-11-16T12:59:25.547 回答
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.
于 2010-10-25T14:26:25.920 回答
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应该有帮助。

于 2010-10-28T21:57:46.237 回答