如您所说,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;
}
}
(来源:其他过程中的控制焦点)