2

Windowsフォームアプリケーションを作成していて、「メモ帳」と「Webブラウザ」が開いている場合、アプリケーションがフォーカスを得る前にフォーカスを持っていた最後のものにフォーカスを与える方法は?

4

2 に答える 2

3

Alt+Tab を押すと、常に以前にアクティブだったウィンドウに戻ります。コードはワンライナーです。

    SendKeys.Send("%{TAB}")
于 2012-12-01T15:10:08.807 に答える
1

コールバック関数を API のコレクションと一緒に使用して、Alt-Tab で (Alt-Tab ウィンドウを表示せずに) 表示できるプログラム (開いているウィンドウ) のリストを見つけることができます。

まず、使用する API のコレクションを宣言します。

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);

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

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

[DllImport("user32.dll")]
private static extern int EnumWindows(CallBackPtr callPtr, int lPar);

[DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
public static extern bool SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder         lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wparam, int lparam);

const int WM_GETTEXT = 0xD;

private static int windowCount = 0;

次に、ウィンドウを列挙し、最後のウィンドウをアクティブにする必要があります。

public static bool EnumWindowProc(int hwnd, int lParam)
{
    if (!IsWindowVisible((IntPtr)hwnd) || GetWindow((IntPtr)hwnd, GW_OWNER) != IntPtr.Zero)
    return true;

    string name = GetWindowTextRaw((IntPtr)hwnd);
    if (name.Length > 0)
    {
        windowCount++;
        if (windowCount == 2) //The previouse active window
        {
            SetForegroundWindow((IntPtr)hwnd);
            return false;
        }
    }


    return true;
}

次のコードを使用して、ウィンドウの名前を取得します。

public static string GetWindowTextRaw(IntPtr hwnd)
{
    var length = (int)SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
    var sb = new StringBuilder(length + 1);
    SendMessage(hwnd, WM_GETTEXT, sb.Capacity, sb);
    return sb.ToString();
}

最後に次の関数を呼び出します。

public void ActivateLastWindow()
{
    callBackPtr = EnumWindowProc;
    windowCount = 0;
    EnumWindows(callBackPtr, 0);
}
于 2012-12-01T14:54:55.850 に答える