Findwindow和SendMessage

时间:2010-10-25 00:56:07

标签: vb6 sendmessage findwindow

嘿所有我想弄清楚为什么这不是给记事本发送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)。

我缺少什么?

大卫

3 个答案:

答案 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).aspxhttp://msdn.microsoft.com/en-us/library/ms633574(VS.85).aspx#class_name应该有所帮助。