0

次のコードを使用して、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;
    }
}
4

1 に答える 1

0

2 つのクライアント領域の間で変換を実行する必要があるようです...

最初に読むリンクは次のとおりです: http://support.microsoft.com/kb/11570

実装方法は、マウス描画がどこから開始され、どこに描画されるかによって大きく異なりますが、「ホスティングアプリ」がマウスリスナーであり、ジャーナルが描画先であるとしましょう- シーケンスはおそらく次のようになります (疑似コード):

screenCoords = ClientToScreen(mouse coords)
journalCoords = ScreenToClient(screenCoords)

次に、Journal に描画するために行っていたこと (WM_MOUSEメッセージなど)。

于 2013-01-25T18:59:19.233 に答える