次のコードを使用して、Winform アプリケーションに「Windows Journal」アプリケーションを埋め込もうとしました。それは機能し、すべてがよさそうです。しかし、既にアプリケーションの子ウィンドウになっている Windows Journal アプリケーションを使い始めると、マウスの動作に一貫性がないことがわかりました。具体的には、たとえば、(x, y) から (x+100, y) に線を引こうとしたが、(x-50, y-50) から (x, Y-50)。「Mouse synchronize/inconsistent」、「setparent 後のアプリケーションの異常な動作」、「child-windows の奇妙な動作」というキーワードでググってみましたが、関連する解決策はまだ見つかりませんでした。また、setParent の前に WS_POPUP スタイルをクリアしようとしましたが、うまくいきませんでした。誰か私にアイデアを教えてもらえますか?ありがとう。
//IntPtr appWin is the MainWindowHandle of Windows Journal process
ShowWindowAsync(appWin, SW_SHOWNORMAL);
// Put it into this form
SetParent(appWin, this.Handle);
// Remove border and whatnot
SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
// Move the window to overlay it on this window
MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
コードは、JournalControl.cs という名前のコントローラーにあり、JournalControl は、アプリケーションのメイン フォームの splitContainer.Panel にあります。そのため、メインフォームのボタンがクリックされたら、まずユーザーが Journal アプリケーションで指定した jnt ファイルを開きます。
public void OpenJournal(string JNTPath)
{
try
{
if (File.Exists(JNTPath))
{
proc.StartInfo.FileName = @"C:\Program Files\Windows Journal\Journal.exe";
proc = Process.Start(JNTPath);
this.timCheckJournal = new System.Windows.Forms.Timer();
this.timCheckJournal.Tick += new System.EventHandler(this.timCheckJournal_Tick);
}
else
{
MessageBox.Show("Couldn't find JNTPath: " + JNTPath);
}
}
catch (Exception ex)
{
ExceptionPublisher.PublishEx(ex);
}
}
次に、timCheckJournal_Tick() で、アプリケーションを Panel 内に配置します。
private void timCheckJournal_Tick(object sender, EventArgs e)
{
timCheckJournal.Enabled = false;
IntPtr appWin = GetJournalTopWindowHandle();
if (appWin != IntPtr.Zero)
{
ShowWindowAsync(appWin, SW_SHOWNORMAL);
// Put it into this form
SetParent(appWin, this.Handle);
// Remove border and whatnot
SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
// Move the window to overlay it on this window
MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
}
else
{
timCheckJournal.Enabled = true;
}
}