我有一个侧栏应用程序(对话框Win窗体应用程序),它使用Watin自动化控制关联的IE浏览器。
当侧边栏被激活时,我还希望将相关的浏览器向前移动,但我不希望win form app失去焦点。
我已经尝试了以下代码的许多设置/变体,但winforms应用程序一旦激活就会失去焦点到浏览器,因此无法按下表单上的任何按钮!
private void BrowserControlForm_Activated(object sender, EventArgs e)
{
if (this.Browser != null)
{
SetWindowPos(this.Browser.hWnd, -1, this.Width, 0, System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - this.Width, System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height, 0);
}
}
问。将当前激活的(Winforms)窗口下的其他窗口置于(Z顺序)下的正确方法是什么?
示例代码还调整了浏览器的大小,占用了屏幕的其余部分,但这与问题无关。更多现有代码无助于解决问题。
更新
SWP_NOACTIVATE根本无法启动浏览器窗口:
SetWindowPos(this.CareCheckBrowser.hWnd, -1, this.Width, 0, System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - this.Width, System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height, 0x0010 /*SWP_NOACTIVATE*/);
在当前窗口的句柄仍然失去焦点后插入:
SetWindowPos(this.Browser.hWnd, (int)this.Handle, this.Width, 0, System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - this.Width, System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height, 0);
在浏览器不起作用后将当前窗口设置为顶部,因为焦点已经丢失(因此仍然会忽略按钮单击)。焦点/激活只需点击任意点击即可:
SetWindowPos(this.Browser.hWnd, 0, this.Width, 0, System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - this.Width, System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height, 0x0004);
SetForegroundWindow(this.Browser.hWnd);
SetForegroundWindow(this.Handle);
答案 0 :(得分:1)
取出所有打开的窗口把手并查看未最小化的窗口。遍历列表,除了浏览器句柄:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsIconic(IntPtr hWnd); //returns true if window is minimized
private List<IntPtr> windowsHandles = new List<IntPtr>();
//fill list with window handles
for (i = 0; i < windowsHandles.Count; i++)
{
if (windowsHandles[i] != browserHandle && windowsHandles[i] != this.Handle && !IsIconic(windowsHandles[i]))
{
SetWindowPos(windowsHandles[i], HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
}
瓦尔特