透過C#切換到目前處於背景工作中的執行緒(應用程式)

因為工作中有用到,需要去找尋目前正在Windows工作階段內的所有工作(應用程式、執行緒),並且將其調用到平台的最前面(前景、Foreground)。因此去翻了一下偉大的Windows API,果然在user32.dll中找到相關的好物啦!

有用到的方法列舉如下:

調用背景工作中的執行緒到前景之程式碼

話不多說了,直接看程式碼,運行的介面一樣是採用我最愛的console啦!

class Program
{
	//設定視窗型式
	[System.Runtime.InteropServices.DllImport("user32.dll")]
	private static extern bool ShowWindowAsync(IntPtr hWnd, int iSWCmd);
	private const int SW_HIDE = 0;
	private const int SW_NORMAL = 1;
	private const int SW_MAXIMIZE = 3;
	private const int SW_SHOWNOACTIVATE = 4;
	private const int SW_SHOW = 5;
	private const int SW_MINIMIZE = 6;
	private const int SW_RESTORE = 9;
	private const int SW_SHOWDEFAULT = 10;
	//設定視窗為前景
	[System.Runtime.InteropServices.DllImport("user32.dll")]
	private static extern bool SetForegroundWindow(IntPtr hWnd);
	//判斷視窗是否為最小化
	[System.Runtime.InteropServices.DllImport("user32.dll")]
	private static extern bool IsIconic(IntPtr hWnd);
	static void Main(string[] args)
	{
		WriteLine("//切換程式視窗//");
		Write("請輸入應用程式檔案名稱(不必包含副檔名):");
		System.Diagnostics.Process[] oProcess = System.Diagnostics.Process.GetProcessesByName(ReadLine());
		if (oProcess.Length > 0)
		{
			IntPtr hWindow = oProcess[0].MainWindowHandle;
			if (IsIconic(hWindow)) { ShowWindowAsync(hWindow, SW_MAXIMIZE); }
			SetForegroundWindow(hWindow);
		}
		else
		{
			WriteLine("目前的工作中沒有這個執行緒喔!");
		}
	}
}
WindowsAPI System.Diagnostics.Process BackgroundTask ForegroundTask ShowWindowAsync SetForegroundWindow