18

私はc#でプロセスウィンドウをフォアグラウンド/フォーカスに設定しようとしています(その瞬間にフォーカスがないアプリケーションから)。したがって、user32.dllstatic extern bool SetForegroundWindow(IntPtr hWnd)メソッドを使用しています:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd); 
public void setFocus()
{
    SetForegroundWindow(process.MainWindowHandle);       
}

すべてが正常に機能していますが、Visual Studio 2008 を開いている場合に限り、VS08 からアプリケーションを起動する必要さえありません。プロジェクトを開いておくだけで十分です。プロジェクトを閉じている瞬間、アプリケーションは他のウィンドウをフォアグラウンドに設定できません。唯一の結果は、タスクバーで他のウィンドウが青色で強調表示されることです。VS08 でプロジェクトを再び開くと、問題なく動作しています。

理由は少しもわかりません...問題は、彼がdllをインポートできないことですが、それが強調表示されずstatic extern bool ShowWindow(IntPtr hWnd, IntPtr status);、プロジェクトが閉じられても他のwin32関数が機能していることだと思いました。

この問題の解決策やヒントはありますか?

編集: 関数のコメントを読みましたが、アプリケーションにフォーカスがないことがわかったので、これを試しました:

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll")]
static extern bool AllowSetForegroundWindow(int procID);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 
public void setAUTFocus()
{
    IntPtr hWnd = GetForegroundWindow();
    uint processID = 0;
    uint threadID = GetWindowThreadProcessId(hWnd, out processID);
    int intID = (int)processID;
    AllowSetForegroundWindow(intID);
    SetForegroundWindow(process.MainWindowHandle); 
}        

今、私は現在フォーカスがあるウィンドウプロセスを探しており、このウィンドウに設定しAllowSetForegroundWindow、今ウィンドウにフォーカスを設定しようとしています。しかし、同じ問題があり、VS でプロジェクトを開いた瞬間に動作します。そうでない場合は、タスクバーに青いハイライトしか表示されません。

アプリケーションを実行している間、vs プロジェクトを開いたり閉じたりできます。開いている瞬間はすべてが機能し、閉じている瞬間は機能していません。アプリケーションの実行中に VS プロジェクトと対話することはありません。真剣に、私はそれを理解していません。

4

2 に答える 2

24

インターネットで数日検索した後、SetForegroundWindow を Windows 7 で動作させるための可能な簡単な解決策を 1 つ見つけました。SetForegroundWindow を呼び出す前に Alt キーを押します。

public static void ActivateWindow(IntPtr mainWindowHandle)
    {
        //check if already has focus
        if (mainWindowHandle == GetForegroundWindow())  return;

        //check if window is minimized
        if (IsIconic(mainWindowHandle))
        {
            ShowWindow(mainWindowHandle, Restore);
        }

        // Simulate a key press
        keybd_event((byte)ALT, 0x45, EXTENDEDKEY | 0, 0);

        //SetForegroundWindow(mainWindowHandle);

        // Simulate a key release
        keybd_event((byte)ALT, 0x45, EXTENDEDKEY | KEYUP, 0);

        SetForegroundWindow(mainWindowHandle);
    }

そして、win32api インポート

  private const int ALT = 0xA4;
  private const int EXTENDEDKEY = 0x1;
  private const int KEYUP = 0x2;
  private const uint Restore = 9;

  [DllImport("user32.dll")]
  private static extern bool SetForegroundWindow(IntPtr hWnd);

  [DllImport("user32.dll")]
  private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

  [DllImport("user32.dll")]
  [return: MarshalAs(UnmanagedType.Bool)]
  private static extern bool IsIconic(IntPtr hWnd);

  [DllImport("user32.dll")]
  private static extern int ShowWindow(IntPtr hWnd, uint Msg);

  [DllImport("user32.dll")]
  private static extern IntPtr GetForegroundWindow();
于 2012-12-14T15:31:38.230 に答える
15

Enterキーを選択するとウィンドウメニューが強制的に開かれるため、Altキーの送信に問題がありました(必要な[OK]ボタンではなく)。

これは私のために働いた:

public static void ActivateWindow(IntPtr mainWindowHandle)
{
    //check if already has focus
    if (mainWindowHandle == GetForegroundWindow())  return;

    //check if window is minimized
    if (IsIconic(mainWindowHandle))
    {
        ShowWindow(mainWindowHandle, Restore);
    }

    // Simulate a key press
    keybd_event(0, 0, 0, 0);

    SetForegroundWindow(mainWindowHandle);
}
于 2015-06-01T11:53:45.180 に答える