通过进程名获取 窗口句柄

通过进程名获取 窗口句柄HWNDFindMainWindow(unsignedintprocessID){structHANDLE_DATA{unsignedintprocessID;HWNDhandle;}data;data.processID=processID;data.handle=0;staticautoIsMainWindow=[](HWNDhandle)->BOOL{.

大家好,又见面了,我是你们的朋友全栈君。

HWND FindMainWindow(unsigned int processID)
{
    struct HANDLE_DATA {
        unsigned int processID;
        HWND handle;
    } data;
    data.processID = processID;
    data.handle = 0;

    static auto IsMainWindow=[](HWND handle)->BOOL
    {
        return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
    };

    static auto EnumWindowsCallback=[](HWND handle, LPARAM lParam)
    {
        HANDLE_DATA& data = *(HANDLE_DATA*)lParam;
        unsigned long process_id = 0;
        GetWindowThreadProcessId(handle, &process_id);
        if (data.processID != process_id || !IsMainWindow(handle)) {
            return TRUE;
        }
        data.handle = handle;
        return FALSE;
    };

    EnumWindows(EnumWindowsCallback, (LPARAM)&data);

    return data.handle;
}

DWORD GetProcessID(const char *ProcessName)
{
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);

    //获取进程快照
    HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
    {
        //   qDebug("CreateToolhelp32Snapshot 调用失败.");
        return -1;
    }

    //遍历进程快照,轮流显示每个进程的信息
    BOOL bMore = ::Process32First(hProcessSnap, &pe32);
    while (bMore)
    {
        // qDebug("进程名称:%ls", pe32.szExeFile); //这里得到的应该是宽字符,用%ls,不然无法正常打印
        // qDebug("进程ID:%u", pe32.th32ProcessID);
        if ( QString( pe32.szExeFile ) == ( ProcessName ) )
        {
            qDebug("进程名称:%ls", pe32.szExeFile);
            qDebug("进程ID:%u", pe32.th32ProcessID);
            qDebug("pcPriClassBase :%u", pe32.pcPriClassBase);
            qDebug("th32ParentProcessID :%u", pe32.th32ParentProcessID);
            qDebug("cntThreads :%u", pe32.cntThreads);
            break;
        }

        bMore = ::Process32Next(hProcessSnap, &pe32);
    }

    //不要忘记清除掉snapshot对象
    ::CloseHandle(hProcessSnap);

    return pe32.th32ProcessID;
}

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162554.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • [33]python Web 框架:Tornado

    [33]python Web 框架:Tornado1.TornadoTornado:python编写的web服务器兼web应用框架1.1.Tornado的优势轻量级web框架异步非阻塞IO处理方式出色的抗负载能力优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器1.2.TornadoVSDjang…

  • SpringBoot调用第三方接口[通俗易懂]

    SpringBoot调用第三方接口[通俗易懂]Spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接,我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。RestTemplate默认依赖JDK提供http连接的能力(HttpURLConnect…

  • goland最新版激活3月最新在线激活

    goland最新版激活3月最新在线激活,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 给js对象添加属性和方法属性_js给json对象添加属性

    给js对象添加属性和方法属性_js给json对象添加属性方式一:在定义对象时,直接添加属性和方法functionPerson(name,age){ this.name=name; this.age=age; this.say=function(){ alert(name+’:::’+age); }}varperson=newPerson(‘张三’,24);person.say();方式二:…

    2022年10月24日
  • 虚拟机配置DNS服务器「建议收藏」

    虚拟机配置DNS服务器「建议收藏」虚拟机配置DNS服务DNS简介下面演示如何通过虚拟机安装DNS服务器windows2003(DNS服务端)安装DNS服务客户端做相应配置回到windows2003新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入DNS简介

  • jenkins自动触发构建_jenkins触发器

    jenkins自动触发构建_jenkins触发器前言跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。jenkins的定时任务是用的crontab语法定时构建语法

发表回复

您的电子邮箱地址不会被公开。

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