我正在编写一个C#应用程序,其中我的应用程序中的窗口与某些第三方应用程序的窗口相关联。每当创建外部程序的窗口时,我的窗口应该出现在该窗口的旁边,并在窗口关闭时消失。
我正在使用AccessibleEvents
和pinvoke
根据第三方窗口更改创建/销毁/重新定位我的窗口。我要求每当选择第三方窗口(到达前台)时,我的窗口应该在第三方窗口的后面。每当我的窗口被选中时,第三方窗口应该再次出现在前台,我的窗口应该在第三方窗口的后面。
我尝试使用SystemForeground
和SetForegroundWindow
窗口来实现这一目标,但我无法找到正确的方法。
实现这一目标的正确方法是什么?或者,有没有办法安全地将两个窗户绑在一起?我也尝试使用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);
}
}
}
}
}