通过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


相关推荐

  • 从伯努利分布到多项式分布的条件_伯努利分布的期望

    从伯努利分布到多项式分布的条件_伯努利分布的期望1.伯努利分布(bernoulidistribution)又称0-1分布,指一次随机试验,结果只有两种。也就是一个随机变量的取值只有0和1。其中p表示一次伯努利实验中结果为正或为1的概率。概率计算:

    2022年10月12日
    4
  • 二维数组赋值 java_java二维数组的赋值方法「建议收藏」

    二维数组赋值 java_java二维数组的赋值方法「建议收藏」在java数组中,我们想要知道其长度,可以通过赋值的方法来实现。在正式开始对数组赋值前,我们要明确其中的下标问题。在准备步骤上,先找到高维的位置,再确定低纬的下标,就可以进行相关的赋值操作了。下面就具体的二维数组赋值,我们先简单分析赋值的概念,然后带来具体的赋值实例。1.赋值概念使用双下标访问二维数组中的元素:第一个下标代表:行号(高维下标)。第二个下标代表:列号(低维下标)。2.赋值实例(1)赋…

    2022年5月6日
    161
  • Python列表(list)详解[通俗易懂]

    Python列表(list)详解[通俗易懂]Python内置的四种常用数据结构:列表(list)、元组(tuple)、字典(dict)以及集合(set)。这四种数据结构一但都可用于保存多个数据项,这对于编程而言是非常重要的,因为程序不仅需要使

    2022年7月3日
    40
  • rapidgator怎么下载_他来时有闪电百度云

    rapidgator怎么下载_他来时有闪电百度云在国内,文件的分享基本上市通过百度云盘来的,但很多小伙伴有时候会发现需要下载的文件是放在一些国外云盘上的,这些文件该怎么下载捏?其实国外的云盘种类非常多,不像国内的一家独大,常用的国外云盘比如Rapidgator,alfafile,uploadgig,filespace等等。但这些云盘都是有些类似的特点就是,如果不付费下载的需要验证码或者下载的超级慢!!!尤其在国内的网络环境下。不仅如此,…

    2025年9月30日
    8
  • Linux修改用户名和用户组

    Linux修改用户名和用户组最近安装了RedHatEnterpriseLinux5,以作学习之用。因为安装的时候随手创建了一个用户,后来却不太满意,需要修改下用户名。摸了许久才搞定并且理解,记录如下:总体来说,修改用户名和所在组,经过了一下步骤:1.修改用户名称2.修改用户所在主要组名称3.修改用户主目录名称4.修改新用户主目录指向上述步骤,经过图形界面修改和命令修改两

    2025年11月21日
    4
  • mysql联合主键

    mysql联合主键1、hibernate配置联合主键1.1联合主键的好处:联合主键的好处是不需要因为需要主键而增加一个无用的主键列1.2联合主键的建表语句CREATETABLE`HTTP_TERMINAL_DETAIL_STATISTICS`( `TIME`CHAR(14)NOTNULLCOMMENT’时间’, `TERMINAL_TYPE`VARCHAR(128)NOTNULLCO…

    2022年6月29日
    32

发表回复

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

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