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

これが問題だと思います。メモ帳ウィンドウの周りのフレームにメッセージを送信しているので、メニューウィンドウに送信する必要があります。FindWindowExと32768クラス名(メニュー)でハンドルを使用して、ハンドルを取得したメニューウィンドウの子であるメニューウィンドウを取得します。2つのページがあります: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 に答える
1

Sendmessage の代わりに Postmessage を使用する

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 に答える