我们有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);
     }
  }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top