2009-12-16 52 views
0

我们有一个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); 

,但即使我得到这个工作,我仍然需要拦截第一点击鼠标。谢谢你的帮助!

回答

1

如果C#窗口实际上是子窗口,它会工作吗?可以通过将父HWND作为参数传递给C#COM对象,然后使用PInvoke在C#窗口上调用SetParent来完成此操作。 (我从来没有这样做过,但听起来至少和ShowWindow和任务栏一样安全?)

(注意SetParent的文档中的注释,您可能还需要摆弄子窗口?窗口标志)

(根据C#窗口类型,它可能已经有可以使用Handle属性,否则你可以杂牌一个的PInvoke调用FindWindow函数来获得它的句柄)

+0

那声音。有希望。我明天要出行,但周末会试一试! – 2009-12-17 20:02:09

+0

所以我试过这个,它确实将C#窗口变成了传统C++窗口的子窗口。它现在位于指定父级的窗口区域内,不能再最小化到任务栏。我很可能现在必须在C++应用程序中管理它。感谢您的建议! – 2009-12-21 18:51:12

+0

//代码... [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

0
// 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); 
    } 
    } 
+0

IntPtr会不会更安全? HWND是一种指针/句柄类型,因此您希望它在64位平台上进行扩展。 – ChrisV 2009-12-21 19:10:48