0

「{TAB}」キーを別のアプリケーションウィンドウに送信したい(テキストボックスではなくウィンドウにキーを送信する)。

私は試した:

SendMessage(hWnd, WM_SETHOTKEY, VK_TAB, 0)

何も起こらなかった。
私の目標は 、アプリケーションウィンドウにフォーカス がない
ときに 、タブキーをアプリケーションまたは他のアプリケーションに送信することです。この場合、sendkeyはプロフェッショナルではないことを知っています(これは私がそれを使用するのは初めてです)。

私は何度も試みましたが、いつも同じ結果に戻りました。

何も起こらなかった。

誰かが答えを知っていますか?

4

3 に答える 3

8

SendKeysを使用するには、キーの送信先のアプリケーションがアクティブである必要があります。

上記のリンクから:

SendKeysを使用して、キーストロークとキーストロークの組み合わせをアクティブなアプリケーションに送信します。

この制限を回避するには、WinApi関数を使用する必要があります。

  1. FindWindow pInvoke.net
  2. FindWindowEx pInvoke.net
  3. sendMessage pInvoke.net

例については、このMSDNフォーラムの投稿を参照してください

その投稿からの変更された例は次のとおりです。

Public Class Form1
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                     (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
                     (ByVal hWnd As IntPtr, ByVal hWndChildAfterA As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                     (ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
    Const WM_SETTEXT As Integer = &HC

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim destination As IntPtr = FindWindow(Nothing, "Untitled - Notepad")
        Dim destControl As IntPtr = FindWindowEx(destination, IntPtr.Zero, "Edit", Nothing)
        SendMessage(destControl, WM_SETTEXT, IntPtr.Zero, "Hello" & vbTab & "GoodBye" & vbCrLf)

    End Sub

End Class

WM_KEYDOWNウィンドウタイトルをTestFormに設定して別の小さなアプリケーションを作成し、WndProcメソッドをオーバーライドして、アプリケーションがTabKeyを取得したかどうかを判断するための追加の例を追加しました。

フォームの送信

Public Class Form1

    Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                 (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                 (ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As IntPtr
    Const WM_KEYDOWN As Integer = &H100
    Const VK_TAB As Integer = &H9

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim destination As IntPtr = FindWindow(Nothing, "TestForm")
        SendMessage(destination, WM_KEYDOWN, VK_TAB, 0)

    End Sub

End Class

テストフォーム

MyBase.WndProc(m)にブレークポイントを設定し、mを調べて何が送信されたかを確認します。

Public Class Form1

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        MyBase.WndProc(m)
    End Sub

End Class
于 2012-10-31T01:58:52.943 に答える
1

このタイプのこれまでに数回苦労したことがありますが、いくつかの点を検討することをお勧めします。

1 つ目は、 vb.netから参照できる dll を含む autoit で、使い方は非常に簡単で、ドキュメントも充実しています。サードパーティのプログラムを制御する必要があるときはいつでもそれを使用する傾向があります。

もう 1 つはui 自動化クラス です。例については、次を参照してください。

http://blog.functionalfun.net/2009/06/introduction-to-ui-automation-with.html

于 2012-10-30T23:25:25.787 に答える
0

最初に他のウィンドウをアクティブにする必要があります。チェックVB.NET でフォーカスを別のウィンドウに変更します。次に、送信キーを使用します。

于 2012-10-30T22:15:27.073 に答える