2012-02-27 11 views
4

OK、名前などでウィンドウを見つけることができました。私が見つけられなかったのは、ウィンドウアプリケーションのフォーカスを最後のアクティブウィンドウに切り替える方法です。私が下に示しているコードは、アクティブなタスクマネージャのアクティブなアプリケーションのリストを私に与えます。Alt-Tabのような最後のアクティブなアプリケーションに切り替えます。

どのようにするかわからないのは、どのアプリケーションが最後のアクティブなアプリケーションであったかを把握してから、それに切り替えます。たとえば...

私は自分のカスタム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"; 
      } 
     }   

    } 
+0

http://stackoverflow.com/questions/210504/enumerate-windows-like-alt-tab-does – vulkanino

+0

私はすでにこれを見ました。それは私にとってはうまくいかない。 HWNDはどのクラスですか?私はSystem.Windows.Interopを持っていないようですがSystem.Runtime.InteropServicesがありますが、このクラスには含まれていないようです。 –

+0

HWNDはWindows SDKから提供され、ウィンドウのハンドルを表します。 – vulkanino

答えて

1

私のコメントはあなたを助けていなかったので、ここでは少しの履歴書(ただし、それをテストしていない)です:

[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); 
} 
+0

Vulkaninoありがとう、主な問題は、DLLImportを何度も実際に使用していないことと、コードを完全に理解できないことです。あなたが追加したコードを見ています。正しく理解すれば、GetPreviousWindowを使用して最後のアクティブウィンドウのhwndを返します。しかし、私がMessageBox.Showを追加すると(GetPreviousWindow()); GetPreviousWindowはhwndのIntPtrを期待していることをボタンアクションに伝えます。私はそれが私のために見つけたものだと思った。 –

+0

申し訳ありませんが、私の間違いですが、パラメータは無駄です。正しい答えを編集します。 – vulkanino

+0

私はこのコードvulkaninoをボタンアクションに配置することで、ボタンが置かれているアプリケーションに対してハンドルまたは何が呼び出されたかを返すだけです。 (以前のアプリケーションを呼び出さないことを意味します) –

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); 
+0

これはまさに私がやろうとしていたことです。 –

+0

興味深いメモ。このコードは私のテストウィンドウのフォームアプリケーションで動作しますが、私がそれを使って遊んでいる小さなユーティリティに入れても、以前のアプリケーションに切り替えることはありません。それは、見えるプロセスだけのアプリケーションに切り替わります。 –

関連する問題