setParent之后子窗口的奇怪行为

时间:2013-01-25 00:33:54

标签: c# .net winforms pinvoke setparent

我尝试使用以下代码在Winform应用程序中嵌入“Windows Journal”应用程序。它工作,一切都很好。但是,当我开始使用已经是我的应用程序的子窗口的Windows Journal应用程序时,我发现鼠标的行为不一致。更具体地说,例如,我试图从(x,y)到(x + 100,y)画一条线,但是在(x-50,y-50)到(x,的y 50)。我通过使用关键字“鼠标同步/不一致”,“setparent之后的应用程序异常行为”,“子窗口的奇怪行为”进行了Google搜索,但尚未找到任何相关解决方案。我也尝试在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的Controller中,而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;
    }
}

1 个答案:

答案 0 :(得分:0)

听起来你需要在两个客户区之间进行翻译......

以下是首先阅读的链接:http://support.microsoft.com/kb/11570

你如何实现它将在很大程度上取决于鼠标绘图的起始位置以及应该绘制的位置,但是假设你的“托管应用程序”是鼠标监听器而日记是你想要的东西绘制 - 序列可能看起来像(伪代码):

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

然后你要做什么来吸引日记 - WM_MOUSE消息等