我们有一个C++遗留应用程序,并且使用从父C++应用程序使用COM调用的c#applet进行扩展。他们带来了非模态的窗户。此外,我认为这些.NET窗口不是C++应用程序的适当子类,因为EnumChildWindows忽略了它们,而EnumWindows发现它们。但是,一个类似于孩子的行为仍然存在,因为如果关闭父C++应用程序,c#窗口也会关闭。来自传统C++应用程序的C#子进程窗口问题
我所有这一切的基本问题是,如果用户调用其中一个c#applet,然后无意中单击父(C++)应用程序窗口,c#窗口将下降到背景。如果用户想要将其带回顶端,他们应该能够在TaskBar中单击它的图标。不幸的是,出于一些奇怪的原因,通常有必要单击任务栏图标三次!第一次应该给顶部带来一个隐藏的窗口,但事实并非如此。第二次点击最小化隐藏窗口,第三次将其成功还原。
有其他人在桥接遗留问题时遇到这个错误/功能 - >。NET鸿沟?我想知道是否可以截获我的C#applet的任务栏图标上的第一次单击,并以某种方式强制它回到顶端。 :-)
我一直在尝试用下面的:
[DllImport("User32.dll")]
private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);
,但即使我得到这个工作,我仍然需要拦截第一点击鼠标。谢谢你的帮助!
那声音。有希望。我明天要出行,但周末会试一试! – 2009-12-17 20:02:09
所以我试过这个,它确实将C#窗口变成了传统C++窗口的子窗口。它现在位于指定父级的窗口区域内,不能再最小化到任务栏。我很可能现在必须在C++应用程序中管理它。感谢您的建议! – 2009-12-21 18:51:12
//代码... [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(); //立即调用... \t SetWindowParent(hwndParent); } private void SetWindowParent(int parenthwnd) { if(0!= parenthwnd) { int handle = GetForegroundWindow(); SetParent(handle,parenthwnd); } } – 2009-12-21 18:57:39