C#孩子的过程中遗留C++应窗口的问题
-
20-09-2019 - |
题
我们有c++的遗产应用程序,并已经延伸它与c#程序,是援引使用COM从父c++应用程序。他们把窗户都没有模式。此外,我认为这些。净窗户都没有适当的儿童的c++应用程序,因为EnumChildWindows错过了他们,并EnumWindows发现他们。一个孩子-就像的行为仍然存在,但是,在这如果你接近父c++应用程序,c#窗口将关闭。
我的基本问题这一切是,如果用户调用一个这c#小程序然后无意地击的父母(c++)程序的窗口,c#窗口下降的背景。如果用户要把这个带回到上面,他们应能够只要点击图标的任务栏。不幸的是,对于一些奇怪的原因,常常有必要击任务栏标 三次!第一时间应带来一个隐藏的窗口,但它不。第二点击减少的隐藏的窗口,以及第三,恢复它的成功。
有其他人碰这个问题/要素时弥补的遗产->.净鸿沟?我想知道,如果我可以拦截的第一次点击任务栏上的图标为我的C#小程序,并以某种方式迫使它爪其方式回到顶峰。:-)
我一直在尝试如下:
[DllImport("User32.dll")]
private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);
但即使如果我得到这工作我会仍然需要截获这一可.谢谢你的帮助!
解决方案
将它的工作如果C#窗户实际上是儿童windows?它也许可以完成,通过父HWND作为一个参数的C#COM对象,然后使用PInvoke叫 SetParent 在C#窗。(我从来没有这样做,但它听起来至少作为安全,因为战斗ShowWindow和任务吧?)
(说明的评论在documetation为SetParent,你可能还需要摆弄儿童的窗户窗口的标志吗?)
(根据C#窗口的类型,它可能已经有了一个处理财产可以使用;否则,你可以暂且一PInvoke呼吁FindWindow得到处理。)
其他提示
// Here's the code...
[DllImport("User32.dll")]
static extern int GetForegroundWindow();
[DllImport("User32.dll")]
private static extern int SetParent(int hwndChild, int hwndParent);
public void ShowMyFormAsChildOf ( int hwndParent )
{
MyForm form = new MyForm();
form.Show(); // immediately after .Show(), it is the foreground window!
SetWindowParent( hwndParent );
}
private void SetWindowParent(int parenthwnd)
{
if (0 != parenthwnd)
{
int handle = GetForegroundWindow();
SetParent(handle, parenthwnd);
}
}
不隶属于 StackOverflow