我不得不解決類似的問題,我不得不做一些pInvoking把它完成。見下面的代碼。
delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);
public static class WindowEnumerator
{
[DllImport("user32.dll", SetLastError = true)]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("USER32.DLL")]
private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam);
[DllImport("USER32.DLL")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("USER32.DLL")]
private static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("USER32.DLL")]
private static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("USER32.DLL")]
private static extern IntPtr GetShellWindow();
public static IDictionary<IntPtr, string> GetOpenWindowsFromPID(int processID)
{
IntPtr hShellWindow = GetShellWindow();
Dictionary<IntPtr, string> dictWindows = new Dictionary<IntPtr, string>();
EnumWindows(delegate(IntPtr hWnd, int lParam)
{
if (hWnd == hShellWindow) return true;
if (!IsWindowVisible(hWnd)) return true;
int length = GetWindowTextLength(hWnd);
if (length == 0) return true;
uint windowPid;
GetWindowThreadProcessId(hWnd, out windowPid);
if (windowPid != processID) return true;
StringBuilder stringBuilder = new StringBuilder(length);
GetWindowText(hWnd, stringBuilder, length + 1);
dictWindows.Add(hWnd, stringBuilder.ToString());
return true;
}, 0);
return dictWindows;
}
}
...
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
...
Process yourProcess = ???;
Dictionary<IntPtr, string> windows = (Dictionary<IntPtr, string>)WindowEnumerator.GetOpenWindowsFromPID(yourProcess.Id);
IntPtr mainWindowHandle = IntPtr.Zero;
foreach (KeyValuePair<IntPtr, string> pair in windows)
{
if (pair.Value.ToUpperInvariant() == "Main Window Title")
{
mainWindowHandle = pair.Key;
break;
}
}
if (mainWindowHandle != IntPtr.Zero)
{
if (IsIconic(mainWindowHandle))
{
ShowWindow(mainWindowHandle, 9);
}
SetForegroundWindow(mainWindowHandle);
}
你是什麼意思「叫他們時,他們已經在運行」是什麼意思?你只是想讓他們把注意力集中在用戶的電腦上嗎?你是否試圖爲正在運行的應用程序調用一些API? –
是否確定要切換到其他應用程序(與在應用程序中嵌入瀏覽器控件相反)?有些背景在這裏會有幫助。 如果你真的想切換,我想你想要的是(COM)Interop API(Google是你的朋友:) - 這應該允許你切換到應用程序(如果已經運行)或啓動(如果沒有)。 – David
我只是想切換到另一個正在運行的應用程序。不管是什麼應用程序 - 我只是想通過按鈕事件來做到這一點。根據我的理解,您可以從任務管理器中顯示的進程名稱中調用它。它是一個C#winform我工作。 – Steve