私のアプリケーションでは、C# から C++ で作成されたダイアログを呼び出そうとしています。ネイティブの C++ ダイアログと、 を使用して同じアセンブリ自体でそのダイアログを表示する方法がありDialog.DoModal()
ます。
私がしたことは、ダイアログを開くメソッドを呼び出す CLI ラッパー コードを作成したことです。次に、C# でそのラッパーを使用しました。
メソッドを呼び出すと、C++ でダイアログが開きますが、フォーカスがありません。ダイアログの任意のボタンをクリックしようとすると、最初のクリックが初めて機能しません。その後、フォーカスを取得し、それ以降は正常に動作します。
SetActiveWindow
やのようなものを使ってみSetForegroundWindow
ました。また、使用して C# フォーム ハンドルを取得し、Control.Handle
それを C++ に渡して親として設定しようとしました。私が試したことはうまくいきませんでした。
何か案は?
C++ コード:
void CCustomDialogDllFunc::CCustomDialogDllFunc(void)
{
HINSTANCE hInst = LoadLibrary("CustomDialogResource.dll");
if(hInst != NULL)
AfxSetResourceHandle(hInst);
}
bool CCustomDialogDllFunc::DlgDisp(void)
{
CCustomDialog Dlg;
Dlg.DoModal();
return false;
}
CLI ラッパー:
WCustomDialogCall::WCustomDialogCall(void)
{
dialogdllfunc = new CCustomDialogDllFunc;
}
WCustomDialogCall::DlgDisp(void)
{
dialogdllfunc->DlgDisp();
}
C#:
void CSMethod()
{
WCustomDialogCall nativeDialog = new WCustomDialogCall();
nativeDialog.DlgDisp();
}