给定一个窗口,我如何确定它是否是winforms应用程序的一部分?

时间:2014-06-20 05:52:43

标签: c# .net winforms winapi

我有Winforms应用程序的主要形式的句柄,以及我试图检查的窗口(可能是也可能不是应用程序的一部分)。我尝试使用GetParent进行迭代,但它似乎无法正常工作。

我实际上要做的是检测模态窗口(例如MsgBox),获取它的控件,并在控件满足某些要求时发送按钮单击消息(如be { {1}})。

现在,虽然我可以检测到模态窗口是否打开,并且可以找到当前聚焦的窗口,但我不知道当前聚焦的窗口是否是检测到的模态窗口。基本上,如果我打开一个模型窗口,然后打开一个完全不同的程序,它会尝试找到该外部程序的控件。

代码如下:

Button

1 个答案:

答案 0 :(得分:4)

一个便利函数(C ++),用于确定由HWND标识的两个窗口是否属于同一个进程,如下所示:

bool OwnedBySameProcess(HWND hWnd1, HWND hWnd2) {
    if ( ::IsWindow(hWnd1) && ::IsWindow(hWnd2) ) {
        DWORD procId1 = 0x0;
        DWORD procId2 = 0x0;
        ::GetWindowThreadProcessId(hWnd1, &procId1);
        ::GetWindowThreadProcessId(hWnd2, &procId2);
        return ( procId1 == procId2 );
    }
    return false;
}

GetWindowThreadProcessId不受UIPI (User Interface Privilege Isolation)约束,并且在有效输入的情况下始终会成功。返回值是ID,不需要清理。

转换为C#:

public class Helper
{
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool IsWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd,
                                                out uint lpdwProcessId);

    public static bool OwnedBySameProcess(IntPtr hWnd1, IntPtr hWnd2)
    {
        if ( !IsWindow(hWnd1) )
            throw new ArgumentException("hWnd1");
        if ( !IsWindow(hWnd2) )
            throw new ArgumentException("hWnd2");
        uint procId1 = 0;
        GetWindowThreadProcessId(hWnd1, out procId1);
        uint procId2 = 0;
        GetWindowThreadProcessId(hWnd2, out procId2);
        return ( procId1 == procId2 );
    }
}