强制窗口在打开时获得焦点

3

我有一个WPF应用程序,它通过套接字连接与C++ MFC应用程序通信。如果用户在C++应用程序中按下特定按钮,则会显示一个新的WPF窗口。

以下是调用启动WPF窗口的代码:

var window = new Window();
window.Topmost = true;
window.Show();
window.Activate();
window.Topmost = false;

在某些机器上,以这种方式显示的第一个窗口(仅限第一个窗口)将不会有键盘焦点。它将位于C++应用程序的前面,但C++应用程序仍将具有键盘焦点。是否有其他方法可以强制WPF窗口每次都获取键盘焦点?


window.Focus() 应该可以解决你的问题。 - evanmcdonnal
每次执行 window.Focus() 都会返回 false。 - battmanz
window.Focus() returns a boolean value identifying whether or not that window has the focus. My guess is that your window doesnt have focus when you call Focus(), so it will always be false.. to give your window focus, use window.Focus() = true; - Pseudo Sudo
根据文档 https://developer.mozilla.org/en-US/docs/Web/API/Window/focus,`window.Focus()`不应返回任何值(但是返回undefined)。 - Sven Mawby
3个回答

4

试试这个:

var window = new Window();    
window.Show();
window.Activate();
window.Focus();
window.Topmost = true;
window.Topmost = false;

2

您尝试过将窗口的Focusable属性设置为true,然后调用window.Focus()吗?这可能会有所帮助。


1
原来 window.Activate() 返回了 false。查看该方法的文档,它说:

确定窗口是否被激活的规则与 Win32 SetForegroundWindow 函数(User32.dll)使用的规则相同。

然后 SetForegroundWindow 的文档说明如下:

可以设置前景窗口的进程可以通过调用 AllowSetForegroundWindow 函数启用另一个进程设置前景窗口。

因此解决方案是让 C++ 应用程序使用 AllowSetForegroundWindow 函数,以允许 WPF 应用程序设置前景窗口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接