学习目标:
识记句柄的作用
了解窗口句柄类型HWND
了解FindWindowA 访问指定窗口的句柄
HWND FindWindowA(
[in, optional] LPCSTR lpClassName,
[in, optional] LPCSTR lpWindowName
);
/*
参数
[in, optional] lpClassName
类型: LPCTSTR
类名或上一次对 RegisterClass 或 RegisterClassEx 函数的调用创建的类名或类原子。 原子必须位于 lpClassName 的低序单词中;高阶单词必须为零。
如果 lpClassName 指向字符串,则指定窗口类名。 类名可以是向 RegisterClass 或 RegisterClassEx 注册的任何名称,也可以是预定义控件类名称中的任何名称。
如果 lpClassName 为 NULL,它将查找其标题与 lpWindowName 参数匹配的任何窗口。
[in, optional] lpWindowName
类型: LPCTSTR
窗口名称 (窗口的标题) 。 如果此参数为 NULL,则所有窗口名称都匹配。
返回值
类型:HWND
如果函数成功,则返回值是具有指定类名和窗口名称的窗口的句柄。
如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。
注解
如果 lpWindowName 参数不 为 NULL, FindWindow 将调用 GetWindowText 函数以检索窗口名称进行比较。 有关可能出现的潜在问题的说明,请参阅 GetWindowText 的备注。
*/
了解SetWindowTextA 设置标题
BOOL SetWindowTextA(
[in] HWND hWnd,
[in, optional] LPCSTR lpString
);
/*
参数
[in] hWnd
类型:HWND
要更改其文本的窗口或控件的句柄。
[in, optional] lpString
类型: LPCTSTR
新的标题或控件文本。
返回值
类型: BOOL
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
注解
如果目标窗口由当前进程所有, SetWindowText 将导致 将WM_SETTEXT 消息发送到指定的窗口或控件。 但是,如果控件是使用 WS_CAPTION 样式创建的列表框控件, 则 SetWindowText 设置控件的文本,而不是列表框条目。
若要在另一进程中设置控件的文本,请直接发送 WM_SETTEXT 消息,而不是调用 SetWindowText。
SetWindowText 函数不会 (ASCII 代码0x09) 展开制表符。 制表符显示为垂直条 (|) 个字符。
*/
了解GetWindowTextA 获得标题
int GetWindowTextA(
[in] HWND hWnd,
[out] LPSTR lpString,
[in] int nMaxCount
);
/*
参数
[in] hWnd
类型:HWND
包含文本的窗口或控件的句柄。
[out] lpString
类型: LPTSTR
将接收文本的缓冲区。 如果字符串的长度或长于缓冲区,则字符串将被截断,并用 null 字符终止。
[in] nMaxCount
类型: int
要复制到缓冲区的最大字符数,包括 null 字符。 如果文本超出此限制,则会将其截断。
返回值
类型: int
如果函数成功,则返回值是复制字符串的长度(以字符为单位),不包括终止 null 字符。 如果窗口没有标题栏或文本,如果标题栏为空,或者窗口或控件句柄无效,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
此函数无法检索另一个应用程序中编辑控件的文本。
注解
如果目标窗口由当前进程拥有, GetWindowText 将导致 将WM_GETTEXT 消息发送到指定的窗口或控件。 如果目标窗口由另一个进程拥有并具有标题, GetWindowText 将检索窗口标题文本。 如果窗口没有标题,则返回值为 null 字符串。 此行为是设计使然。 如果拥有目标窗口的进程未响应,则应用程序无需响应即可调用 GetWindowText 。 但是,如果目标窗口未响应并且它属于调用应用程序, GetWindowText 将导致调用应用程序变得无响应。
若要在另一进程中检索控件的文本,请直接发送 WM_GETTEXT 消息,而不是调用 GetWindowText。
*/
通过spy++
windows.h
计算器 窗口句柄 =004D04A4 //每次重启进程的时候窗口句柄都会发生改变
计算器的 标题 "无标题-记事本"
计算器的 类名 "Notepad"
#include <iostream>
#include<Windows.h>
int main()
{
//HWND 窗口句柄 = FindWindowA(NULL,"计算器");// (HWND)0x0390AD0;
HWND 窗口句柄 = FindWindowA("Notepad", "无标题 - 记事本");// 第一个参数是类名;
printf("窗口句柄=%p\r\n", 窗口句柄);
char buffer[256] = { '0' };
GetWindowTextA(窗口句柄, (LPSTR)buffer,256);
printf("%s\n", buffer);
SetWindowTextA(窗口句柄, "1111222新标题名adfadfasdfs");
GetWindowTextA(窗口句柄, (LPSTR)buffer, 256);
printf("%s\n", buffer);
printf("sizeof(窗口句柄)=%zd字节\r\n", sizeof(窗口句柄)); //eax,rax
getchar();
}