あなたが言ったようにGetFocus
、現在のスレッドのメッセージキューによって管理されるウィンドウハンドルに対してのみ機能します。必要なことは、メッセージ キューを別のプロセスに一時的にアタッチすることです。
- でフォアグラウンド ウィンドウのハンドルを取得します
GetForegroundWindow
。
- スレッドのスレッド ID と、フォアグラウンド ウィンドウを所有するスレッドを で取得します
GetWindowThreadProcessId
。
- を使用して、メッセージ キューをフォアグラウンド ウィンドウのスレッドに接続します
AttachThreadInput
。
GetFocus
フォアグラウンド ウィンドウのスレッドからウィンドウ ハンドルを返す呼び出し。
- フォアグラウンド ウィンドウのスレッドから
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;
}
}
(出典:他工程のコントロールフォーカス)