如何将我的窗口挂钩到外部程序窗口?

时间:2016-02-13 17:21:35

标签: c# .net wpf windows

我正在编写一个C#应用程序,其中我的应用程序中的窗口与某些第三方应用程序的窗口相关联。每当创建外部程序的窗口时,我的窗口应该出现在该窗口的旁边,并在窗口关闭时消失。

我正在使用AccessibleEventspinvoke根据第三方窗口更改创建/销毁/重新定位我的窗口。我要求每当选择第三方窗口(到达前台)时,我的窗口应该在第三方窗口的后面。每当我的窗口被选中时,第三方窗口应该再次出现在前台,我的窗口应该在第三方窗口的后面。

我尝试使用SystemForegroundSetForegroundWindow窗口来实现这一目标,但我无法找到正确的方法。

实现这一目标的正确方法是什么?或者,有没有办法安全地将两个窗户绑在一起?我也尝试使用SetWindowLong,但它看起来有风险,因为窗口的所有权将转移到3方窗口。

以下是代码:

private void SystemForeground(IntPtr winEventHookHandle, AccessibleEvents accEvent, IntPtr windowHandle, int objectId, int childId, uint eventThreadId, uint eventTimeInMilliseconds)
{
    int nRet;

    StringBuilder className = new StringBuilder(256);
    //Get the window class name
    nRet = NativeMethods.GetClassName(windowHandle, className, className.Capacity);

    if (nRet != 0)
    {
        if (accEvent == AccessibleEvents.SystemForeground)
        {
            if ((string.Compare(className.ToString(), "3rdPartyWindow", true, CultureInfo.InvariantCulture) == 0))
            {
                // Check if this 3 party window is mapped to our window.
                if (convWindowButtonTable.ContainsKey(windowHandle))
                {
                    Form form =(Form)convWindowButtonTable[windowHandle];
                    NativeMethods.SetWindowPos(form.Handle, windowHandle, 0, 0, 0, 0, NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOSIZE);
                }
            }
            // Check if this 3 party window for which event is received is mapped to our window.
            else if (buttonConvWindowTable.ContainsKey(windowHandle))
            {
                IntPtr foreGrnd = NativeMethods.GetForegroundWindow();
                IntPtr convWndHndl = (IntPtr)buttonConvWindowTable[windowHandle];
                if (foreGrnd.ToInt32() != convWndHndl.ToInt32())
                {
                    NativeMethods.SetForegroundWindow(convWndHndl);
                }
            }
        }
    }            
}

0 个答案:

没有答案