1

私は例えば働きます。Firefoxで、私のC#.NETアプリはそのウィンドウを前面に表示します。それは問題ありませんが、SendToBack()を使用してフォームを非表示にすると、Firefoxのウィンドウがアクティブ化されないため、Firefoxがフォアグラウンドにある場合でも、ウィンドウをクリックしてスクロールできるようにする必要があります。 C#で以前にフォーカスされたウィンドウ?

私はこれらを試しました:

[DllImport("User32")]
private static extern int SetForegroundWindow(IntPtr hwnd);

[DllImport("user32.dll")]
static extern bool AllowSetForegroundWindow(int dwProcessId);

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[...]

AllowSetForegroundWindow(System.Diagnostics.Process.GetCurrentProcess().Id);
SendToBack();
SetForegroundWindow(GetForegroundWindow());

ウィンドウを返送した後、前のウィンドウがGetForegroundWindowによって返されることを期待していましたが、機能しません。

次に、WndProcをオーバーライドし、WM_ACTIVATEメッセージを処理してlParamから前のウィンドウを取得しようとしましたが、このハンドルでSetForegroundWindow()を使用しても機能しません。

protected override void WndProc(ref Message msg) {
        if (msg.Msg == 0x0006) {
            prevWindow = msg.LParam;
        }
        base.WndProc(ref msg);
}

[...]

SetForegroundWindow(prevWindow);
4

2 に答える 2

2

SetActiveWindow関数を試しましたか?SetForgroundWindow関数とは別のものですが、両方を使用する必要があるようです。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646311%28v=vs.85%29.aspx

動作するように聞こえるSetFocus関数もあります。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646312%28v=vs.85%29.aspx

アップデート

現在のアクティブウィンドウを取得するには、アプリケーションをスタックの先頭に移動する前にGetActiveWindow関数を起動します。これにより、前にアクティブだったウィンドウのハンドルを取得できます。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646292%28v=vs.85%29.aspx

もう1つの更新 私はサイトをもう少し掘り下げて、次の3つのリンクを思いつきました。キーボード入力関数は、呼び出し元のスレッドのメッセージキューの一部として設定しようとしているウィンドウに依存しているようですが、2つの別々のアプリケーションスレッドを扱っているため、そうではない可能性があります。

GetGUIThreadInfo Get the threads information, including active window

GUITHREADINFO The GUITHREADINFO structure

SwitchToThisWindow Another method of window changing

これらはすべて、SetForegroundWindowメソッドと同じメソッドスタックにあります。これにより、試行していることを実行する可能性が高くなります。

于 2012-08-06T18:31:14.860 に答える
0

SetFocus()アプリを前に進めるために呼び出すと、前にフォーカスがあったウィンドウのハンドルが返されます。

于 2012-08-06T18:47:21.177 に答える