今天就跟大家聊聊有關(guān)怎么在c#項目中通過調(diào)用Win32Api關(guān)閉當(dāng)前應(yīng)用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)提供從項目策劃、軟件開發(fā),軟件安全維護、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評估等整套的建站服務(wù),主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、成都網(wǎng)站制作,成都app軟件開發(fā)以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。創(chuàng)新互聯(lián)深信只要達到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!Win32 API即為Microsoft 32位平臺的應(yīng)用程序編程接口(Application Programming Interface)。所有在Win32平臺上運行的應(yīng)用程序都可以調(diào)用這些函數(shù)
使用Win32 API,應(yīng)用程序可以充分挖掘Windows的32位操作系統(tǒng)的潛力。 Microsoft的所有32位平臺都支持統(tǒng)一的API,包括函數(shù)、結(jié)構(gòu)、消息、宏及接口。使用 Win32 API不但可以開發(fā)出在各種平臺上都能成功運行的應(yīng)用程序,而且也可以充分利用每個平臺特有的功能和屬性。
在具體編程時,程序?qū)崿F(xiàn)方式的差異依賴于相應(yīng)平臺的底層功能的不同。最顯著的差異是某些函數(shù)只能在更強大的平臺上實現(xiàn)其功能。例如,安全函數(shù)只能在Windows NT操作系統(tǒng)下使用。另外一些主要差別就是系統(tǒng)限制,比如值的范圍約束,或函數(shù)可管理的項目個數(shù)等等。
思路
使用EnumWindows接口枚舉當(dāng)前窗口;
過濾掉不可用、隱藏、最小化的窗口;
過濾掉子窗口;
通過標(biāo)題、類名過濾掉系統(tǒng)窗口;
使用PostMessage發(fā)送關(guān)閉窗口信息。
// 過濾掉系統(tǒng)的一些窗口 private static string[] filterTitles = new string[1] { "program manager"}; private static string[] filterClasses = new string[5] { "shell_traywnd", "workerw", "button", "progman", "windows.ui.core.corewindow"}; private void CloseCurrentApp() { CallBack sort = new CallBack(EnumCallback); EnumWindows(sort, 0); return; } private bool EnumCallback(IntPtr hwnd, int lParam) { string title = GetWindowText(hwnd); StringBuilder className = new StringBuilder(256); int nRet = GetClassName(hwnd, className, className.Capacity); if (nRet == 0) className.Append(""); if (!IsWindowVisible(hwnd)) return true; if (!IsWindowEnabled(hwnd)) return true; if (IsIconic(hwnd)) return true; // 過濾掉子窗口 IntPtr parent = GetParent(hwnd); string parentTitle = GetWindowText(parent); if (parent != IntPtr.Zero) { if (IsWindowVisible(parent) && IsWindowEnabled(parent)) return true; } IntPtr owner = GetWindow(hwnd, GW_OWNER); if (owner != IntPtr.Zero) { if (IsWindowVisible(owner) && IsWindowEnabled(owner)) return true; } if (!filterTitles.Contains(title.ToLower()) && !filterClasses.Contains(className.ToString().ToLower())) { PostMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); Console.WriteLine("關(guān)閉窗口(句柄:{0}, 標(biāo)題:{1})!", hwnd, title); #region 獲取窗口信息 int processID = -1; long threadID = -1; processID = GetWindowThreadProcessId(hwnd, out threadID); bool isiconic = IsIconic(hwnd); uint gwlStyle = (uint)GetWindowLong(hwnd, GWL_STYLE); IntPtr hProcess = OpenProcess(ProcessAccessFlags.QueryInformation, false, processID); string fullPath = ""; if (hProcess != IntPtr.Zero) { int capacity = 1024; StringBuilder processName = new StringBuilder(capacity); QueryFullProcessImageName(hProcess, 0, processName, ref capacity); fullPath = processName.ToString(0, capacity); CloseHandle(hProcess); } Console.WriteLine("-------------------窗口info:---------------"); Console.WriteLine("====標(biāo)題:{0} 句柄:{1}====", title, hwnd); Console.WriteLine("====父窗口標(biāo)題:{0} 父窗口句柄:{1}====", parentTitle, parent); Console.WriteLine("====進程ID:{0} 類名:{1}====", processID, className.ToString()); Console.WriteLine("====進程名:{0}====", fullPath); Console.WriteLine("====isiconic:{0} 樣式:{1}====", isiconic, gwlStyle); WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); placement.length = System.Runtime.InteropServices.Marshal.SizeOf(placement); GetWindowPlacement(hwnd, ref placement); Console.WriteLine("====placement:{0}====", placement.showCmd); EnumPropsDelegate prop = new EnumPropsDelegate(EnumPropsProc); EnumProps(hwnd, prop); #endregion 獲取窗口信息 return false; } return true; } private bool EnumPropsProc(IntPtr hwnd, IntPtr lpszString, IntPtr hData) { string propName = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(lpszString); Console.WriteLine("====屬性:{0} 數(shù)據(jù):{1}====", propName, hData); return true; } #region Win32Api public const int GWL_STYLE = (-16); public const int GWL_EXSTYLE = (-20); public const int GW_OWNER = 4; public const int WS_EX_TOOLWINDOW = 0x00000080; public const int WM_SYSCOMMAND = 0x0112; public const int WM_CLOSE = 0x10; public const int SC_CLOSE = 0xF060; public delegate bool CallBack(IntPtr hwnd, int lparam); public delegate bool EnumPropsDelegate(IntPtr hwnd, IntPtr lpszString, IntPtr hData); [DllImport("user32.dll")] public static extern int EnumWindows(CallBack x, int y); [DllImport("user32.dll", CharSet = CharSet.Auto)] internal static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder lpString, int nMaxCount); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int GetWindowTextLength(IntPtr hWnd); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern int GetClassName(IntPtr hWnd, System.Text.StringBuilder lpClassName, int nMaxCount); [DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr hwnd); [DllImport("user32.dll")] public static extern bool IsWindowEnabled(IntPtr hwnd); [DllImport("user32.dll", EntryPoint = "IsIconic")] public static extern bool IsIconic(IntPtr hWnd); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr GetParent(IntPtr hwnd); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr GetWindow(IntPtr hwndParent, int nCmd); [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)] public static extern long GetWindowLong(IntPtr hwnd, int nIndex); [DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)] public static extern bool PostMessage(IntPtr hwnd, uint Msg, uint wParam, uint lParam); [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern int GetWindowThreadProcessId(IntPtr hWnd, out long lpdwProcessId); [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr OpenProcess( ProcessAccessFlags processAccess, bool bInheritHandle, int processId ); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool QueryFullProcessImageName([In]IntPtr hProcess, [In]int dwFlags, [Out]System.Text.StringBuilder lpExeName, ref int lpdwSize); [DllImport("coredll.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CloseHandle(IntPtr hObject); [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); [DllImport("user32.dll")] public static extern int EnumProps(IntPtr hWnd, EnumPropsDelegate lpEnumFunc); public struct WINDOWPLACEMENT { public int length; public int flags; public int showCmd; public System.Drawing.Point ptMinPosition; public System.Drawing.Point ptMaxPosition; public System.Drawing.Rectangle rcNormalPosition; } [Flags] public enum ProcessAccessFlags : uint { All = 0x001F0FFF, Terminate = 0x00000001, CreateThread = 0x00000002, VirtualMemoryOperation = 0x00000008, VirtualMemoryRead = 0x00000010, VirtualMemoryWrite = 0x00000020, DuplicateHandle = 0x00000040, CreateProcess = 0x000000080, SetQuota = 0x00000100, SetInformation = 0x00000200, QueryInformation = 0x00000400, QueryLimitedInformation = 0x00001000, Synchronize = 0x00100000 } public static string GetWindowText(IntPtr hwnd) { int capacity = GetWindowTextLength(hwnd) * 2; System.Text.StringBuilder lpString = new System.Text.StringBuilder(capacity); GetWindowText(hwnd, lpString, lpString.Capacity); if (lpString.Length > 0) { return lpString.ToString(); } return string.Empty; } #endregion Win32Api
看完上述內(nèi)容,你們對怎么在c#項目中通過調(diào)用Win32Api關(guān)閉當(dāng)前應(yīng)用有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。