cpscode 发表于 2021-5-21 02:18

C#获取窗口句柄和进程ID的类

刚刚从老旧的VB6.0转移到C#的IDE当中,那玩意简直是干啥啥不行啊,关键Windows10还不支持。。。
最近遇到个小项目(瞎折腾),需要枚举窗口句柄,并且获得相关的信息,各种折腾我,最后一通宵搞定,希望能帮助到需要的人:keai


private static extern int GetWindowTextW(int hWnd, StringBuilder lpString, int nMaxCount);


private static extern int GetClassNameW(int hWnd, StringBuilder lpString, int nMaxCount);

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


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");

            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

可能会用到先看一下
页: [1] 2
查看完整版本: C#获取窗口句柄和进程ID的类