关注第三方应用程序并返回

我正在用C#编写。

我有一个程序,可以嵌入我的程序中嵌入的第三方应用程序。 我还有一个RichTextBox,可以在其中写入文本,然后实时显示在嵌入式应用程序中。 一切正常,但我需要移动鼠标,因为应用程序将获得焦点,然后刷新并向我显示更改。

这是一个过程:

private void button2_Click(object sender, EventArgs e)
{
    System.IO.File.WriteAllText(@"ForParsing.txt", textBox1.Text);

    pdf.StartInfo.FileName = @"yap.exe";
    pdf.StartInfo.Arguments = "ForParsing.dvi";
    pdf.Start();
    pdf.WaitForInputIdle(-1);
    SetParent(pdf.MainWindowHandle, this.splitContainer2.Panel1.Handle);
    SetWindowPos(pdf.MainWindowHandle, HWND_TOP,
        this.splitContainer2.Panel1.ClientRectangle.Left,
        this.splitContainer2.Panel1.ClientRectangle.Top,
        this.splitContainer2.Panel1.ClientRectangle.Width,
        this.splitContainer2.Panel1.ClientRectangle.Height,
        SWP_NOACTIVATE | SWP_SHOWWINDOW);
} 

我在TextBox下面有一个按键处理程序。 当按下键时,我专注于嵌入在我的程序中的第三方应用程序。

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
            System.IO.File.WriteAllText(@"ForParsing.txt", textBox1.Text);
            //Focus on third party application
            SetForegroundWindow(pdf.MainWindowHandle);
}

到现在为止还挺好。 现在的问题是:我想让焦点立即返回到文本框中courser的相同位置。 除了实时刷新嵌入式应用程序之外,我希望能够继续在TextBox中写入任何内容。

简而言之,我需要第三方应用程序立即刷新(获得焦点),并且能够在TextBox中停止的当前位置键入无干扰字符。

这可能吗? 有更好,更简单的解决方案吗? 会乐于听取任何建议。

由于我不能回答自己的问题,所以我会在这里写下:

我找到了解决人们问题的解决方案

这是我所做的:

private void richTextBox1_TextChanged(object sender,EventArgs e){System.IO.File.WriteAllText(@“ForParsing.txt”,textBox1.Text);

        //Focus on third party application
        SetForegroundWindow(pdf.MainWindowHandle);

        //Restore focus
        pdf.WaitForInputIdle();
        SetForegroundWindow(this.Handle);
        this.Focus();

}

感谢大家的帮助


当你需要它重新注意时:

if (!handle.Equals(IntPtr.Zero))
{
    if (NativeMethods.IsIconic(WindowHandle))
        NativeMethods.ShowWindow(WindowHandle, 0x9); // Restore

    NativeMethods.SetForegroundWindow(handle);
}

哪里:

[DllImport("User32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern Boolean IsIconic([In] IntPtr windowHandle);

[DllImport("User32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern Boolean SetForegroundWindow([In] IntPtr windowHandle);

[DllImport("User32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern Boolean ShowWindow([In] IntPtr windowHandle, [In] Int32 command);

通常,当你回头看时,tabindex总是处于你留给它的相同位置。 所以它不会成为一个问题...

链接地址: http://www.djcxy.com/p/41833.html

上一篇: Get focus on third party application and return

下一篇: How to get around the memory leak in the .NET Webbrowser control?