, 나는 그것을 완수하기 위해 몇 가지 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
Im 실행중인 다른 응용 프로그램으로 전환하려고합니다. 앱이 무엇인지 상관하지 말라. 버튼 이벤트만으로도 그 작업을 수행 할 수 있기를 원한다. 내가 이해 한 바로는 작업 관리자에 나타나는 프로세스 이름에서 호출 할 수 있습니다. 그것의 C# winform 내가 일하고있다. – Steve