最新公告
  • 欢迎您光临都潮汇,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • c# 调用Win32Api关闭当前应用的方法

    c# 调用Win32Api关闭当前应用的方法,窗口,函数,句柄,过滤掉,应用程序

    c# 调用Win32Api关闭当前应用的方法

    易采站长站,站长之家为您整理了c# 调用Win32Api关闭当前应用的方法的相关内容。

    Win32 API

    Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数

    使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Microsoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。 在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在Windows NT操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。

    本文介绍Windows系统下使用Win32API获取当前应用并关闭的方法。

    思路

    使用EnumWindows接口枚举当前窗口; 过滤掉不可用、隐藏、最小化的窗口; 过滤掉子窗口; 通过标题、类名过滤掉系统窗口; 使用PostMessage发送关闭窗口信息。

    具体实现

    // 过滤掉系统的一些窗口
    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("关闭窗口(句柄:{0}, 标题:{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("====标题:{0} 句柄:{1}====", title, hwnd);
      Console.WriteLine("====父窗口标题:{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} 数据:{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

    以上就是c# 调用Win32Api关闭当前应用的方法的详细内容,更多关于c# 调用Win32Api关闭应用的资料请关注易采站长站其它相关文章!

    以上就是关于对c# 调用Win32Api关闭当前应用的方法的详细介绍。欢迎大家对c# 调用Win32Api关闭当前应用的方法内容提出宝贵意见

    本网站所有源码和软件均为作者提供和网友推荐收集整理而来!
    本站提供的所有模块、软件等资源,均不提供任何技术服务,请悉知!
    如您需要商用,请支持正版,本站提供的程序仅供学习和研究使用!
    资源每天实时更新,如遇压缩包解压密码,一律为:www.dch888.cn
    如有侵犯你版权的,请来信(邮箱:68628283@qq.com)指出,本站将立即改正。
    都潮汇 » c# 调用Win32Api关闭当前应用的方法

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    都潮汇
    互联网精品资源网站源码分享平台
    升级SVIP尊享更多特权立即升级