0

ウィンドウ ハンドルを取得するための PInvoke 関数がいくつかありますが、使用中のウィンドウ ハンドルを正確に取得するにはどうすればよいでしょうか。たとえば、アプリ内の richTextBox1 ウィンドウなどです。それとも Notepad.exe のテキスト ボックス ハンドルですか? また、chrome/firefox の Web ページ上のテキスト。

3つすべてをつかむ例は悪いお尻です...最も高く評価されるのは、Google ChromeまたはFirefox内です。テキストボックスであるか、PAGEであるかに関係なく。

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern IntPtr GetFocus();

アプリケーション自体のウィンドウでは機能しますが、メモ帳とクロムでは失敗しました

4

1 に答える 1

1

あなたが言ったようにGetFocus、現在のスレッドのメッセージキューによって管理されるウィンドウハンドルに対してのみ機能します。必要なことは、メッセージ キューを別のプロセスに一時的にアタッチすることです。

  1. でフォアグラウンド ウィンドウのハンドルを取得しますGetForegroundWindow
  2. スレッドのスレッド ID と、フォアグラウンド ウィンドウを所有するスレッドを で取得しますGetWindowThreadProcessId
  3. を使用して、メッセージ キューをフォアグラウンド ウィンドウのスレッドに接続しますAttachThreadInput
  4. GetFocusフォアグラウンド ウィンドウのスレッドからウィンドウ ハンドルを返す呼び出し。
  5. フォアグラウンド ウィンドウのスレッドからAttachThreadInput再度切断します。

このようなもの:

using System.Runtime.InteropServices;

public static class WindowUtils {
    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();

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

    [DllImport("user32.dll")]
    static extern IntPtr AttachThreadInput(
        IntPtr idAttach, 
        IntPtr idAttachTo,
        bool fAttach);

    [DllImport("user32.dll")]
    static extern IntPtr GetFocus();

    public static IntPtr GetFocusedControl() {
        IntPtr activeWindowHandle = GetForegroundWindow();

        IntPtr activeWindowThread = 
            GetWindowThreadProcessId(activeWindowHandle, IntPtr.Zero);
        IntPtr thisWindowThread =
            GetWindowThreadProcessId(this.Handle, IntPtr.Zero);

        AttachThreadInput(activeWindowThread, thisWindowThread, true);
        IntPtr focusedControlHandle = GetFocus();
        AttachThreadInput(activeWindowThread, thisWindowThread, false);

        return focusedControlHandle;
    }
}

(出典:他工程のコントロールフォーカス

于 2013-02-11T05:20:29.977 に答える