C#获取进程的主窗口句柄「建议收藏」

C#获取进程的主窗口句柄「建议收藏」publicclassUser32API{  privatestaticHashtableprocessWnd=null;  publicdelegateboolWNDENUMPROC(IntPtrhwnd,uintlParam);  staticUser32API()  {    if(processWnd==nu

大家好,又见面了,我是你们的朋友全栈君。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);

    public static IntPtr GetCurrentWindowHandle()

    {

        IntPtr ptrWnd = IntPtr.Zero;

        uint uiPid = (uint)Process.GetCurrentProcess().Id;  // 当前进程 ID

        object objWnd = processWnd[uiPid];

        if (objWnd != null)

        {

            ptrWnd = (IntPtr)objWnd;

            if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd))  // 从缓存中获取句柄

            {

                return ptrWnd;

            }

            else

            {

                ptrWnd = IntPtr.Zero;

            }

        }

        bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid);

        // 枚举窗口返回 false 并且没有错误号时表明获取成功

        if (!bResult && Marshal.GetLastWin32Error() == 0)

        {

            objWnd = processWnd[uiPid];

            if (objWnd != null)

            {

                ptrWnd = (IntPtr)objWnd;

            }

        }

        return ptrWnd;

    }

    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;   // 返回 false 以终止枚举窗口

            }

        }

      return true;

    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158974.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux默认安装路径在哪里_docker指定安装位置

    linux默认安装路径在哪里_docker指定安装位置Nginx安装安装路径 /usr/local/nginx配置文件 /usr/local/nginx/conf/nginx.conf启动:进入到/usr/local/nginx/sbin下,./nginx关闭:进入到/usr/local/nginx/sbin下 ./nginx -s stop 重启:同上, -s reload停止 kill -9 线程号查看 ps -ef|grep nginxhttps://www.jianshu.com/p/9f2c162ac77c 可参考安装ng

    2022年8月19日
    14
  • 鼠标移到导航上面 当前的LI变色 处于当前的位置

    鼠标移到导航上面当前的LI变色处于当前的位置,广泛应用于当前导航。点击这里查看效果以下是源代码:1234鼠标移到导航上面当前的LI变色处于当前的位置-柯乐义51314152

    2021年12月20日
    54
  • 谈谈我对画面撕裂,垂直同步,Freesync以及G-sync的理解「建议收藏」

    谈谈我对画面撕裂,垂直同步,Freesync以及G-sync的理解「建议收藏」最近一直在接触图形学相关的知识,感觉之前在学OpenGL的时候不需要思考帧缓冲是怎么处理到显示器上的,驱动都帮我做好了,现在在接触vulkan的时候发现自己对Swapchain这个东西的工作原理不是很了解,去网上搜索资料的过程中发现了垂直同步这个知识点,以前玩游戏的时候也经常看到但是不明白什么意思(对不起!我不是一个合格的游戏玩家>-<),觉得自己还是得搞清楚一下,于是整理了一下自己对…

    2022年6月10日
    44
  • apache虚拟主机配置文件_apache是一种什么服务器

    apache虚拟主机配置文件_apache是一种什么服务器Apache配置虚拟主机三种方式记事本打开httpd.conf文件,该文件在apache的目录下,如:D:\AppServ\Apache2.2\conf,修改如下两处:LoadModulevhost_alias_modulemodules/mod_vhost_alias.so//去掉前面的#,意思是启用apache的虚拟主机功能,第203行Includeconf/…

    2022年10月9日
    0
  • 国产自动化测试工具「建议收藏」

    国产自动化测试工具「建议收藏」软件测试工具一直是国外的占据了主流!国内鲜有自主研发的。但是最近几年国内逐渐出现了几个,也许发展下去可以与国外主流软件测试工具厂商一较高下。 AutoRunnerhttp://www.spasvo.com/泽众软件TAR终端自动化测试工具宣称是国内最好的银行业务测试工具。 Tester360http://www.tester360.com/亚

    2022年6月5日
    52
  • SSD网络原理解析[通俗易懂]

    SSD网络原理解析[通俗易懂]SSD网络是继YOLO之后的one-stage目标检测网络,是为了改善YOLO网络设置的anchor设计的太过于粗糙而提出的,其设计思想主要是多尺度多长宽比的密集锚点设计和特征金字塔,下面我将详细的解析SSD网络结构SSD网络结构精简版详细版通过上面这个图,大家可以清楚的看到SSD的网络结构主要分为以下几个部分:VGG16BaseLayer ExtraFeatureLayer DetectionLayer NMS补充说明:在整个SSD网络中,其…

    2022年10月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号