4

わかりました、名前などでウィンドウを見つけることに関する多くの投稿を見つけました。私が見つけていないのは、ウィンドウアプリケーションのフォーカスを見つけて、最後にアクティブなウィンドウに切り替える方法です。以下に示すコードは、アクティブなタスク マネージャー内のアクティブなアプリケーションのリストを表示します。

どうすればいいのか分からないのは、どのアプリケーションが最後にアクティブだったのかを突き止めてから、それに切り替えることです。例えば...

カスタムの winform アプリケーションを開いています。

ボタンをクリックします

アプリケーションが最後にアクティブだったウィンドウ/アプリケーションに切り替わります。

ここに私がこれまでに持っている作業コードがあります。(これはボタンに対するアクションであり、アプリケーションに textbox1 という名前のテキスト ボックスがあることが想定されています。また、System.Diagnostics を使用して追加する必要があります。

    private void button1_Click(object sender, EventArgs e)
    {

        Process[] procs = Process.GetProcesses();
        IntPtr hWnd;
        foreach (Process proc in procs)
        {
            if ((hWnd = proc.MainWindowHandle) != IntPtr.Zero)
            {
                textBox1.Text += (proc.ProcessName.ToString());
                textBox1.Text += "\t";
                textBox1.Text += (hWnd.ToString());
                textBox1.Text += "\r\n";
            }
        }         

    }
4

2 に答える 2

5

この記事をチェックしてください: http://www.whitebyte.info/programming/how-to-get-main-window-handle-of-the-last-active-window

具体的には、このコード:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
enum GetWindow_Cmd : uint
{
    GW_HWNDFIRST = 0,
    GW_HWNDLAST = 1,
    GW_HWNDNEXT = 2,
    GW_HWNDPREV = 3,
    GW_OWNER = 4,
    GW_CHILD = 5,
    GW_ENABLEDPOPUP = 6
}
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);

[...]

IntPtr targetHwnd = GetWindow(Process.GetCurrentProcess().MainWindowHandle, (uint)GetWindow_Cmd.GW_HWNDNEXT);
while (true)
{
    IntPtr temp = GetParent(targetHwnd);
    if (temp.Equals(IntPtr.Zero)) break;
    targetHwnd = temp;
}
SetForegroundWindow(targetHwnd);
于 2012-02-27T16:59:54.263 に答える
2

私のコメントは役に立たなかったので、ここに簡単な履歴書を示します (ただし、テストはしていません)。

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

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

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

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

const uint GA_PARENT = 1;
const uint GA_ROOT = 2;
const uint GA_ROOTOWNER = 3;

public IntPtr GetPreviousWindow()
{
        IntPtr activeAppWindow = GetForegroundWindow();
        if ( activeAppWindow == IntPtr.Zero )
            return IntPtr.Zero;

        IntPtr prevAppWindow = GetLastActivePopup(activeAppWindow);
        return IsWindowVisible(prevAppWindow) ? prevAppWindow : IntPtr.Zero;
 }

 public void FocusToPreviousWindow()
 {
     IntPtr prevWindow = GetPreviousWindow();
     if (  prevWindow != IntPtr.Zero )
         SetForegroundWindow(prevWindow);
 }
于 2012-02-27T17:05:57.847 に答える