C#子プロセスからレガシィC++アプリウィンドウ処理の問題
-
20-09-2019 - |
質問
いてc++の統合にとって延びることにc#アプレットが呼び出され使用COMの親c++アプリです。いまでの窓のないモーダルです。またいと思います。NET windowsなどのc++アプリケーション、EnumChildWindows逃して、EnumWindows見つけました。一つは子供の行動はしばしくは、こちらをご覧ください。親c++アプリはc#のウィンドウがあります。
私の基本的な問題はた場合には、ユーザーを呼び出しこれらのc#アプレット、不用意にクリックは、親会(c++)アプリ画面に窓が背景になります。場合、ユーザーが知りたいこりすることが必要となるにはボタンをクリックするだけのアイコンのページをご参照ください。残念なことにより、一部の不思議な理由があるのに必要なクリックでタスクバーにアイコン 三倍!初めてできるものをお持ちください。隠れたウィンドウの上部では付いていますか?第二次をクリックを最小限に抑え隠れたウィンドウ第三回復した。
は誰に走るこのバグは機能が架橋のレガシー->.純divide?っできれば、切片のクリックでタスクバーにアイコンのための私C#アプレットに何らかの力でクローそのもなっています。:-)
私の実験を重ねてきたの
[DllImport("User32.dll")]
private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);
もっともだからと言ってんこんに遮断する最初のmouseclick.おります。
解決
この作業の場合はC#windowsで実際に子どもたwindows?することは可能ではな達成するために親HWNDの引数としてのC#COMオブジェクトの活用により、PInvokeコ SetParent にC#です。(私も、この音を少なくとも安全性と格闘ShowWindowのタスクバー?)
(注からのコメントのdocumetationのためのSetParentうも怒の子ウィンドウの画面旗?)
によって、C#窓タイプでに設置されているハンドルのプロパティで使用その他きkludge、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);
}
}