通过进程名获取 窗口句柄

通过进程名获取 窗口句柄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;
}

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

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

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


相关推荐

  • settimeout()停止_需求方案

    settimeout()停止_需求方案转载https://aotu.io/notes/2017/09/25/manage-setTimeout-an-setInterval/在管理setTimeout&setInterval这两个APIs时,笔者通常会在顶级(全局)作用域创建一个叫 timer 的对象,在它下面有两个数组成员——{sto,siv},用它们来分别存储需要管理的setTimeoutID/…

    2022年10月3日
    0
  • 背句子,记单词1「建议收藏」

    背句子,记单词1「建议收藏」7000词汇这么背我比较可以接受,连续看20天足以过八级!!(16天完整版)16天记住7000考研词汇(第一天)1.WithmyownearsIclearlyheardtheheartbeatofthenuclearbomb.我亲耳清楚地听到原子弹的心脏的跳动。2.Nextyearthebeardedbearwillbear…

    2022年8月24日
    3
  • 关于StringUtils的isNotBlank方法

    关于StringUtils的isNotBlank方法当Str为空白或者null时,isNotBlank返回false当Str的length>0时,isNotBlank返回true转载于:https://www.cnblogs.com/xujuntao/p/11027523.html

    2022年8月12日
    4
  • 2020年3月23日阿里笔试题[通俗易懂]

    2020年3月23日阿里笔试题[通俗易懂]2020年3月23日阿里笔试题题目描述题目分析  这是阿里的第二场笔试,本来觉得没啥好写的,一道排列组合,一道迷宫。没有什么发挥的空间。但是后来在和大家讨论的过程中,把这道题的公司给敲出来了,但是这公式也不能白敲,干脆写一篇文章总结一下。题目描述一共n个人,从中选出任意个人组成一队,我们不妨记为k,再从k个人选出一人做队长。题目分析  这是一个典型的排列组合问题,从n个人选出k个,可…

    2022年5月22日
    26
  • Java web环境配置和Servlet实例HelloWorld<转自banama的个人博客>

    Java web环境配置和Servlet实例HelloWorld<转自banama的个人博客>

    2021年9月7日
    60
  • python停用词表整理_python停用词表

    python停用词表整理_python停用词表广告关闭腾讯云11.11云上盛惠,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!stop_words:设置停用词表,这样的词我们就不会统计出来(多半是虚拟词,冠词等等),需要列表结构,所以代码中定义了一个函数来处理停用词表…前言前文给大家说了python机器学习的路径,这光说不练假把式,这次,罗罗攀就带大家完成一个中文文本情感分析的机器学习项目,今天的流程如…

    2022年6月15日
    27

发表回复

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

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