通过Windows进程ID获取窗口句柄

通过Windows进程ID获取窗口句柄通过Windows进程ID获取窗口句柄方法一:使用EnumWindows的方式///<枚举窗口参数typedefstruct{HWNDhwndWindow;//窗口句柄DWORDdwProcessID;//进程ID}EnumWindowsArg;///<枚举窗口回调函数BOOLCALLBACKEnumWindowsProc(…

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

通过Windows进程ID获取窗口句柄
方法一:使用EnumWindows的方式

///< 枚举窗口参数
typedef struct
{
HWND hwndWindow; // 窗口句柄
DWORD dwProcessID; // 进程ID
}EnumWindowsArg;
///< 枚举窗口回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
EnumWindowsArg *pArg = (EnumWindowsArg *)lParam;
DWORD dwProcessID = 0;
// 通过窗口句柄取得进程ID
::GetWindowThreadProcessId(hwnd, &dwProcessID);
if (dwProcessID == pArg->dwProcessID)
{
pArg->hwndWindow = hwnd;
// 找到了返回FALSE
return FALSE;
}
// 没找到,继续找,返回TRUE
return TRUE;
}
///< 通过进程ID获取窗口句柄
HWND CProcessTimeRestart::GetWindowHwndByPID(DWORD dwProcessID)
{
HWND hwndRet = NULL;
EnumWindowsArg ewa;
ewa.dwProcessID = dwProcessID;
ewa.hwndWindow = NULL;
EnumWindows(EnumWindowsProc, (LPARAM)&ewa);
if (ewa.hwndWindow)
{
hwndRet = ewa.hwndWindow;
}
return hwndRet;
}

方法二:使用GetTopWindow和GetNextWindow的方式

///< 枚举窗口参数
typedef struct
{
HWND hwndWindow; // 窗口句柄
DWORD dwProcessID; // 进程ID
}EnumWindowsArg;
///< 枚举窗口回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
EnumWindowsArg *pArg = (EnumWindowsArg *)lParam;
DWORD dwProcessID = 0;
// 通过窗口句柄取得进程ID
::GetWindowThreadProcessId(hwnd, &dwProcessID);
if (dwProcessID == pArg->dwProcessID)
{
pArg->hwndWindow = hwnd;
// 找到了返回FALSE
return FALSE;
}
// 没找到,继续找,返回TRUE
return TRUE;
}
///< 通过进程ID获取窗口句柄
HWND CProcessTimeRestart::GetWindowHwndByPID(DWORD dwProcessID)
{
HWND hwndRet = NULL;
EnumWindowsArg ewa;
ewa.dwProcessID = dwProcessID;
ewa.hwndWindow = NULL;
EnumWindows(EnumWindowsProc, (LPARAM)&ewa);
if (ewa.hwndWindow)
{
hwndRet = ewa.hwndWindow;
}
return hwndRet;
}

通过以上两种窗口获得的句柄,和使用FindWindow获得的句柄是一样的。
可以通过SendMessage向窗口发送消息

HWND hwnd = ::FindWindow(NULL, "Test");
::SendMessage(hwnd, WM_CLOSE, 0, 0);

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

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

(0)
上一篇 2022年7月21日 下午7:00
下一篇 2022年7月21日 下午7:00


相关推荐

  • pycharm 快捷键设置为eclipse一样

    pycharm 快捷键设置为eclipse一样2019 独角兽企业重金招聘 Python 工程师标准 gt gt gt

    2026年3月19日
    2
  • java soa 实例_SOA案例

    java soa 实例_SOA案例SOA 案例 SOA 描述了一系列创建松耦合 基于标准 保持业务一致服务的模式和最佳实践 因为在描述实现和绑定之间实现分离关注 SOA 提供了更高层次的灵活性 这个项目由下面技术组成 GroovyGradle 该应用的场景是 一个娱乐提供商要分决定奖励他们最忠诚的客户 需求故事如下 显示客户可申请的奖金 作为客户 我希望看到根据我的频道订阅得到的奖励 账户部门

    2026年3月18日
    2
  • Keepalived搭建

    Keepalived搭建LVS Keepalived 构建拓扑图安装 keepalivedke 起初是为 LVS 设计的 专门用来监控集群系统中各个服务节点的状态 后来又加入了 VRRP 的功能 VRRP 是 VirtualRoute 虚拟路由器冗余协议 的缩写 VRRP 出现的目的就是为了解决静态路由出现的单点故障问题 它能够保证网络的不间断 稳

    2026年3月17日
    1
  • Java程序设计教程牛晓太_Java程序设计教程

    Java程序设计教程牛晓太_Java程序设计教程第1章Java概述1.1Java简介1.1.1Java的产生1.1.2Java的特点1.1.3Java三大平台1.2Java的开发和运行环境1.2.1Java虚拟机1.2.2JDK的安装1.2.3环境变量的设置1.2.4JavaAPI文档1.3Java程序开发实例1.3.1Java应用程序实例1.3.2Java小程序实例1.4Eclipse开发平台1.4.1Ecli…

    2022年7月7日
    24
  • 使用vLLM部署Qwen/Qwen3.5-35B-A3B并且支持在Qwen Code中调用

    使用vLLM部署Qwen/Qwen3.5-35B-A3B并且支持在Qwen Code中调用

    2026年3月13日
    3
  • pycharm 2021.3永久激活码 3月最新注册码

    pycharm 2021.3永久激活码 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    249

发表回复

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

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