5

基本的に、自分のプログラムが他のすべてのプログラムの上に階層化されているかどうかを確認するにはどうすればよいですか?

4

4 に答える 4

1

以下を使用できます。

if (GetForegroundWindow() == Process.GetCurrentProcess().MainWindowHandle)
{
     //do stuff
}

WINAPI インポート (クラス レベル):

[System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool GetForegroundWindow();

値を保持するプロパティを割り当て、IDE を介して、または InitializeComponent(); の後にフォームの GotFocus イベントにチェックを追加します。

例えば:

//.....
InitalizeComponent();
this.GotFocus += (myFocusCheck);
//...

private bool onTop = false;

private void myFocusCheck(object s, EventArgs e)
{
    if(GetFore......){ onTop = true; }
}
于 2012-08-21T05:00:07.260 に答える
0

ウィンドウがフォームを継承している場合は、 Form.Topmost プロパティを確認できます

于 2014-07-23T07:46:45.503 に答える
0

同じ質問に対するこの回答によって、良い解決策が得られます: https://stackoverflow.com/a/7162873/386091

/// <summary>Returns true if the current application has focus, false otherwise</summary>
public static bool ApplicationIsActivated()
{
    var activatedHandle = GetForegroundWindow();
    if (activatedHandle == IntPtr.Zero) {
        return false;       // No window is currently activated
    }

    var procId = Process.GetCurrentProcess().Id;
    int activeProcId;
    GetWindowThreadProcessId(activatedHandle, out activeProcId);

    return activeProcId == procId;
}


[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);

プログラムがダイアログ ボックスを表示するか、取り外し可能なウィンドウを持っている場合 (ウィンドウ ドッキング フレームワークを使用している場合など)、Euric が現在受け入れている解決策は機能しません。

于 2015-12-15T19:06:50.360 に答える