C# 获取窗口句柄并且关闭应用程序
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
public class User32API { private static Hashtable processWnd = null; public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam); static User32API() { if (processWnd == null) { processWnd = new Hashtable(); } } [DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)] public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam); [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)] public static extern IntPtr GetParent(IntPtr hWnd); [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId); [DllImport("user32.dll", EntryPoint = "IsWindow")] public static extern bool IsWindow(IntPtr hWnd); [DllImport("kernel32.dll", EntryPoint = "SetLastError")] public static extern void SetLastError(uint dwErrCode); [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); Process[] processes; const int WM_CLOSE = 0x0010; public void GetCurrentWindowHandle() { Microsoft.Win32.RegistryKey oRegistryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Amada Software"); string[] subKeys = oRegistryKey.GetSubKeyNames(); IntPtr ptrWnd = IntPtr.Zero; foreach (string subkey in subKeys) { processes = Process.GetProcessesByName(subkey); foreach (Process proc in processes) { uint uiPid = (uint)proc.Id; object objWnd = processWnd[uiPid]; if (objWnd != null) { ptrWnd = (IntPtr)objWnd; if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd)) { SendMessage(ptrWnd, WM_CLOSE, 0, 0); } else { ptrWnd = IntPtr.Zero; } } bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid); if (!bResult && Marshal.GetLastWin32Error() == 0) { objWnd = processWnd[uiPid]; if (objWnd != null) { ptrWnd = (IntPtr)objWnd; SendMessage(ptrWnd, WM_CLOSE, 0, 0); } } } } } private static bool EnumWindowsProc(IntPtr hwnd, uint lParam) { uint uiPid = 0; if (GetParent(hwnd) == IntPtr.Zero) { GetWindowThreadProcessId(hwnd, ref uiPid); if (uiPid == lParam) { processWnd[uiPid] = hwnd; SetLastError(0); return false; } } return true; } } 该文章在 2023/9/15 11:50:01 编辑过 |
关键字查询
相关文章
正在查询... |