0

我们有一个 c++ 遗留应用程序,并且一直在使用 c# 小程序对其进行扩展,这些小程序是使用来自父 c++ 应用程序的 COM 调用的。它们会调出非模态窗口。此外,我认为这些 .NET 窗口不是 c++ 应用程序的正确子窗口,因为 EnumChildWindows 错过了它们,而 EnumWindows 找到了它们。但是,仍然存在一种类似孩子的行为,即如果您关闭父 c++ 应用程序,c# 窗口也会关闭。

我对这一切的基本问题是,如果用户调用这些 c# 小程序之一,然后无意中单击父 (c++) 应用程序窗口,c# 窗口就会掉到后台。如果用户想把它带回顶部,他们应该能够在任务栏中单击它的图标。不幸的是,由于一些奇怪的原因,经常需要点击任务栏图标三次!第一次应该把一个隐藏的窗口带到顶部,但它没有。第二次点击最小化隐藏窗口,第三次恢复成功。

在弥合遗留-> .NET 鸿沟时,是否还有其他人遇到过此错误/功能?我想知道我是否可以拦截第一次单击我的 C# 小程序的任务栏图标,并以某种方式强制它返回顶部。:-)

我一直在尝试以下方法:

  [DllImport("User32.dll")]
  private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);

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

4

2 回答 2

1

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

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

(根据 C# 窗口类型,它可能已经有一个可供您使用的 Handle 属性;否则,您可以将 PInvoke 调用合并到 FindWindow 以获取它的句柄。)

于 2009-12-17T00:27:55.683 回答
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);
     }
  }
于 2009-12-21T18:59:19.850 回答