吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4463|回复: 10
收起左侧

[其他转载] C#获取窗口句柄和进程ID的类

  [复制链接]
cpscode 发表于 2021-5-21 02:18
刚刚从老旧的VB6.0转移到C#的IDE当中,那玩意简直是干啥啥不行啊,关键Windows10还不支持。。。
最近遇到个小项目(瞎折腾),需要枚举窗口句柄,并且获得相关的信息,各种折腾我,最后一通宵搞定,希望能帮助到需要的人
[C#] 纯文本查看 复制代码
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int GetWindowTextW(int hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int GetClassNameW(int hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);

public delegate bool WNDENUMPROC(int hWnd, int lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);

/// <summary>
        /// 枚举结构
        /// </summary>
        public struct WindowInfo
        {
            public int PW_Hwnd;
            public string PW_WindowName;
            public string PW_ClassName;
        }

        /// <summary>
        /// 枚举当前系统窗口
        /// </summary>
        /// <returns></returns>
        public static WindowInfo[] FindWindows()
        {
            try
            {
                List<WindowInfo> WindowsList = new List<WindowInfo>();
                EnumWindows(delegate (int APP_Hwnd, int lParam)
                {
                    WindowInfo _W = new WindowInfo();
                    StringBuilder sb = new StringBuilder(256);
                    _W.PW_Hwnd = APP_Hwnd;
                    GetWindowTextW(APP_Hwnd, sb, sb.Capacity);
                    _W.PW_WindowName = sb.ToString();
                    GetClassNameW(APP_Hwnd, sb, sb.Capacity);
                    _W.PW_ClassName = sb.ToString();
                    WindowsList.Add(_W);
                    return true;
                }, 0);
                return WindowsList.ToArray();
            }
            catch (Exception ex)
            {
   //处理异常
            }
            
        }

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

CrazyZhang 发表于 2021-5-21 12:22
其实利用C#自带的Process类就可以做到

            Process process = Process.GetProcessesByName("notepad.exe")[0];

            IntPtr windowHandle = process.Handle;
            int pid = process.Id;
FANT456 发表于 2021-5-21 10:16
sam喵喵 发表于 2021-5-21 12:41
曾经接触过C sharp,也不懂。
这个时候一般就去虚拟机里搞
subney 发表于 2021-5-21 16:16
CrazyZhang 发表于 2021-5-21 12:22
其实利用C#自带的Process类就可以做到

            Process process = Process.GetProcessesByName("not ...

老哥猛啊
 楼主| cpscode 发表于 2021-5-21 18:34
CrazyZhang 发表于 2021-5-21 12:22
其实利用C#自带的Process类就可以做到

            Process process = Process.GetProcessesByName("not ...

关键问题就是他各方面只有窗口句柄是特定的。。。其他的都在变
wuguiliang 发表于 2021-6-8 16:58
曾经接触过C sharp,也不懂
zgbest8 发表于 2021-7-24 23:30
不错不错 学习一下 句柄可以控制窗体 比较有用
xiaokemh 发表于 2022-1-13 11:33
不错不错
imsu 发表于 2022-11-17 11:19
可能会用到先看一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表