2013-01-13 58 views
0

我正在用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(); 

}

感謝大家的幫助

回答

0

當你需要它來集中備份:

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是al你留在同一位置的方式。所以它不會成爲一個問題...

相關問題