8

I've noticed that setforegroundwindow can be very flaky - no matter how you do it.

I've noticed that using UIAutomation, where possible, seems to improve things.

For example:

Getting the WindowPattern and using something like:

windowPattern.SetWindowVisualState( WindowVisualState.Normal );

windowPattern.SetWindowVisualState( WindowVisualState.Maximized );

Now my questions is:

How do I know whether I should make it maximized or normal. The task manager, and dragon naturally speaking both seem to know how to do this. If it was previous maximized, and then minimized, I'd like to maximize the window when I switch to it. If it was previously not maximized, I'd like to make it "Normal".

Any ideas?

4

3 に答える 3

2

AutomationElement の SetFocus が機能しませんでした。

次の質問から: 別のプロセスのウィンドウ状態を取得する

GetPlacement API が必要なものを提供してくれることがわかりました。

     if ( (windowplacement.flags & WPF_RESTORETOMAXIMIZED) > 0 )
     {
        windowPattern.SetWindowVisualState( WindowVisualState.Maximized );
     }
     else
     {
        windowPattern.SetWindowVisualState( WindowVisualState.Normal );
     }

これにより、ウィンドウが最大化されていた場合は最大化された状態に戻り、最大化されていなかった場合は通常の状態に戻ります。

于 2013-07-15T18:06:11.690 に答える
1

わかりました、私は質問を誤解しました。あなたが望むことをするための鍵は、AutomationElement.SetFocus()メソッドを使用することだと思います。

これが基本的な例です。

//I assume you already have some way of getting the window's handle
var wih = new System.Windows.Interop.WindowInteropHelper(window);
IntPtr hWnd = wih.Handle;

//get the automation element from the handle
var ae = AutomationElement.FromHandle(hWnd);

//this will bring the window into focus.
ae.SetFocus();
于 2013-07-15T14:02:44.920 に答える