最活跃,但没有焦点
本文关键字:焦点 活跃 | 更新日期: 2023-09-27 18:33:36
我在这个网站和谷歌上寻找,但什么也没找到。我需要显示一个包含一些控件显示信息的表单,但不需要将焦点窃取到其他窗口(如窗口全屏游戏),并且可以使用表单内的文本框进行写入而无需窃取游戏窗口焦点。
我可以使用以下方法在不窃取焦点的情况下启动窗口:使用 TopMost=true 打开 WinForm 但没有让它窃取焦点?
但是当我在窗口中单击时,请获得焦点。我需要使窗口处于活动状态,文本框可写,但不窃取其他窗口焦点可能吗?
我需要显示包含一些控件显示信息的表单,但需要 不要将焦点窃取到其他窗口 ... 但是当我在窗口中单击时,请获得焦点。
所以在我看来,你想要一个普通的窗口,但只是在第一次显示时不会窃取焦点?
不使用内置Form.Show()
,而是将 ShowWindow() API 与SW_SHOWNA一起使用:
private const int SW_SHOWNA = 4;
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private void ShowWindowWithoutFocus()
{
ShowWindow(this.Handle, SW_SHOWNA);
}
// Sets the window to be foreground
[DllImport("user32.dll")]
private static extern int SetForegroundWindow(IntPtr hwnd);
/// <summary>
/// onVisible focus input username text box
/// </summary>
protected override void OnVisibleChanged(EventArgs e)
{
SetForegroundWindow(this.Handle);
base.OnVisibleChanged(e);
}
您可以使用
窗口显示标志进行控制,如以下示例所示。 但它有一些问题。 要提高顶部位置,当前聚焦进程应具有此窗口。 另一方面,一个进程有两个窗口。 窗口 1 是焦点的,但窗口 2 不是焦点。 如果保持 Windows1 的焦点,则调用 Bellow 函数。 但是窗口 1 和窗口 2 进程是不同的。 此功能不起作用。
window2->SetWindowPos(0, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
无论焦点和过程如何移动顶部位置,您调用两次 setWindowpos
第一:将屏幕移动到最顶部,但窗口始终占据顶部位置和顶部
window2->SetWindowPos(HWND_TOPMOST , 0,0,0,0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
第二:删除最顶层属性
window2->SetWindowPos(HWND_NOTOPMOST , 0,0,0,0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);