如何在一个窗口的SetWindowPos Z-order下激活窗口?

时间:2014-09-01 14:38:05

标签: c# winforms winapi

我有一个侧栏应用程序(对话框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);

1 个答案:

答案 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);
    }
}

瓦尔特