通过进程名获取 窗口句柄

通过进程名获取 窗口句柄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)
上一篇 2022年7月21日 下午5:46
下一篇 2022年7月21日 下午5:46


相关推荐

  • H265文件_h265转码工具

    H265文件_h265转码工具一、H264格式RBSP=SODB+RBSPtrailingbitsNALU=NALheader(1byte)+RBSPH.264=StartCodePrefix(3bytes)+NALU+StartCodePrefix(3bytes)+NALU+…H.264从层次来看分为两层:视频编码层(VCL,VideoCo…

    2025年5月31日
    4
  • 舵机内部结及工作原理浅析[通俗易懂]

    舵机内部结及工作原理浅析[通俗易懂]一、舵机实物图就像上面这张照片,相信大家都不会陌生,我们常见到的舵机就是这个模样,一般是塑料外壳,当然很少见的也有金属外壳的舵机,因为涉及到控制信号,所以一般有三条引出线。像上图所示的样子,舵机有一个三线的接口。黑色线(或棕色线)是接地线,红线接+5V电压,黄线(或是白色或橙色)接控制信号端。(而步进电机一般会有4~6根不等的引出线)二…

    2022年4月27日
    70
  • keil注册机激活的方法

    keil注册机激活的方法一次用注册机产生密码,在license里可能不可以激活。第一次运行一定要记住,要以管理员的身份运行mdk。以管理员的身份运行,注册成功。记录一下

    2022年6月6日
    82
  • OpenClaw 如何部署?阿里云推出 OpenClaw 一键部署方案!三步极简操作,轻松拥有专属 AI 助理!

    OpenClaw 如何部署?阿里云推出 OpenClaw 一键部署方案!三步极简操作,轻松拥有专属 AI 助理!

    2026年3月13日
    3
  • Windows驱动程序开发语言「建议收藏」

    Windows驱动程序开发语言「建议收藏」Windows驱动程序和Win32应用程序一样,都是PE格式,所以说,只要某种语言的编译器能够编译出PE格式的二进制格式文件,并且能够设置驱动程序的入口地址,那么这种语言就可以用来开发Windows驱动程序,所以可以选择C,C++,甚至是Delphi开发。但是由于微软提供的DDK开发环境中的头文件和链接库都是只支持C,C++。因此,大部分时候Windows驱动程序都是用C/C++进行开发的

    2022年10月9日
    5
  • unity安装后续添加模块

    unity安装后续添加模块unitybuildsettingtargetplatform缺少一些选项(linux,mac)unity官方解决方案如下但是unityhub没有addmodule选项前往unity官网下载,找到对应unity版本,点击Releasenotes即可下载对应安装包

    2022年6月27日
    33

发表回复

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

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