Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#来自遗留C+的子进程+;应用程序窗口问题 我们有一个C++遗留应用程序,并用C+Applet扩展它,这些应用程序是从父C++应用程序调用的。它们会打开非模态的窗口。此外,我认为这些.NET窗口不是C++应用程序的合适的子代,因为EnumChildWindows忽略了它们,EnumWindows找到了它们。然而,一个孩子般的行为仍然是,如果关闭父C++应用程序,C窗口也会关闭。_C#_.net_C++_Com Interop_Unsafe - Fatal编程技术网

C#来自遗留C+的子进程+;应用程序窗口问题 我们有一个C++遗留应用程序,并用C+Applet扩展它,这些应用程序是从父C++应用程序调用的。它们会打开非模态的窗口。此外,我认为这些.NET窗口不是C++应用程序的合适的子代,因为EnumChildWindows忽略了它们,EnumWindows找到了它们。然而,一个孩子般的行为仍然是,如果关闭父C++应用程序,C窗口也会关闭。

C#来自遗留C+的子进程+;应用程序窗口问题 我们有一个C++遗留应用程序,并用C+Applet扩展它,这些应用程序是从父C++应用程序调用的。它们会打开非模态的窗口。此外,我认为这些.NET窗口不是C++应用程序的合适的子代,因为EnumChildWindows忽略了它们,EnumWindows找到了它们。然而,一个孩子般的行为仍然是,如果关闭父C++应用程序,C窗口也会关闭。,c#,.net,c++,com-interop,unsafe,C#,.net,C++,Com Interop,Unsafe,我的基本问题是,如果用户调用其中一个c#applet,然后不经意地单击父(c++)应用程序窗口,c#窗口就会掉到后台。如果用户想把它放回顶部,他们应该可以点击任务栏上的图标。不幸的是,出于某些奇怪的原因,经常需要单击任务栏图标三次!第一次应该把一个隐藏的窗口带到顶部,但是它没有。第二次单击可最小化隐藏窗口,第三次单击可成功恢复隐藏窗口 在弥合遗留->.NET鸿沟时,是否有其他人遇到过此错误/功能?我想知道我是否可以拦截我的C#applet在任务栏图标上的第一次点击,并以某种方式迫使它返回顶部。:

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

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

我一直在尝试以下方面:

  [DllImport("User32.dll")]
  private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);
但即使我让它工作,我仍然需要拦截第一个鼠标点击。谢谢你的帮助

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

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


(根据C#窗口类型的不同,它可能已经有了一个可以使用的句柄属性;否则,您可能无法通过PInvoke调用FindWindow来获取它的句柄。)

这听起来很有希望。我明天要去旅行,但周末要试一试!所以我已经尝试过,它确实把C++窗口变成了传统C++窗口的子窗口。它现在位于指定父对象的窗口区域内,并且不能再最小化到任务栏。最有可能的是,我现在必须在C++应用程序中管理它。谢谢你的建议代码。。。[DllImport(“User32.dll”)]静态外部程序int GetForegroundWindow();[DllImport(“User32.dll”)]私有静态外部intsetparent(inthwndchild,inthwndpparent);public void ShowMyFormAsChildOf(int-hwndParent){MyForm form=new-MyForm();form.Show();//立即调用…SetWindowParent(hwndParent);}private void SetWindowParent(int-parenthwnd){if(0!=parenthwnd){int handle=getForeGroundindow();SetParent(handle,parenthwnd);}}}IntPtr不是更安全吗?HWND是指针/句柄类型,因此您希望它在64位平台上扩展。
 // 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);
     }
  }