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);
}

ここまでは順調ですね。ここでの問題: コースサーが TextBox にあったのと同じ場所にフォーカスを即座に戻したい。組み込みアプリケーションのリアルタイム更新以外は何も起こらなかったように、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();

}

みんな助けてくれてありがとう

4

1 に答える 1

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 は常に元の位置と同じ位置にあります。それで問題ないはず…

于 2013-01-13T17:37:42.637 に答える