0

実行中の特定のアプリケーションの子ウィンドウに Handler を取得する必要があります。メイン ウィンドウ ハンドラはありますが、SendMessage/PostMessage を使用するには、アクティブな特定の子ウィンドウを知る必要があります。

私は最終的に、Firefoxを使用して、次のコードを使用してこれを行うことができました:

    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

    [DllImport("user32.dll", EntryPoint = "GetGUIThreadInfo")]
    internal static extern bool GetGUIThreadInfo(uint idThread, out GUITHREADINFO threadInfo);


    private void button1_Click(object sender, EventArgs e)
    {
        //start firefox
        firefox = new Process();
        firefox.StartInfo.FileName = @"C:\Program Files\Mozilla Firefox\firefox.exe";
        firefox.Start();
        Thread.Sleep(10000);

        // get thread of the main window handle of the process
        var threadId = GetWindowThreadProcessId(firefox.MainWindowHandle, IntPtr.Zero);

        // get gui info
        var info = new GUITHREADINFO();
        info.cbSize = (uint)Marshal.SizeOf(info);
        if (!GetGUIThreadInfo(threadId, out info))
            throw new Win32Exception();


        // send the letter W to the active window
        PostMessage(info.hwndActive, WM_KEYDOWN, (IntPtr)Keys.W, IntPtr.Zero);

    }

これはとてもうまくいきます!ただし、アプリケーションがアクティブでない場合 (たとえば、メモ帳が Firefox をカバーしている場合)、GUIThreadInfo にはすべてのメンバーが null になります。Firefox が Windows の最上位 (アクティブ) アプリケーションである場合にのみ、構造が満たされます。

Firefox をフォアグラウンドにすることでこれを修正できることはわかっていますが、これを避ける必要がありました。Windows の一番上のウィンドウではないアプリケーションのアクティブな子ウィンドウを取得する他のアイデアはありますか?

ありがとう

4

2 に答える 2

1

プロセスの最上位のウィンドウハンドルがある場合は、GetTopWindowを使用して、Zオーダーの最上位のウィンドウを受け取ることができるはずです。これは、アプリケーションがアクティブ/現在のアプリに設定されている場合にアクティブになるウィンドウである必要があります。


編集:

AttachThreadInputを使用して、スレッドを他のプロセススレッドにアタッチするのはどうですか?

これを実行すると、GetFocus()およびPostMessage()/ SendMessage()が機能するはずです。完了したら、必ず入力を切り離してください。

私が見つけることができる唯一のサンプルは、残念ながらDelphiにありますが、翻訳するのは簡単です。

于 2009-05-07T00:17:01.877 に答える
0

GetWindow関数 (hWnd、GW_CHILD)を使用して子ウィンドウ ハンドルを取得し、このハンドルにメッセージを投稿することを検討できます。

また、 Microsoft Windows Vista 以降では注意してください。メッセージの投稿は、ユーザー インターフェイス特権の分離 (UIPI) の対象となります。プロセスのスレッドは、以下の整合性レベルのプロセス内のスレッドのメッセージ キューにのみメッセージを投稿できます。

于 2009-05-07T05:17:26.977 に答える