①在窗口列表中寻找与指定条件相符的第一个子窗口
1.该函数通过创建窗口时的类名和窗口名查找窗口并返回该窗口的句柄,函数不会搜索子窗口
2.该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
CWnd* PASCAL FindWindow(
LPCTSTR lpszClassName,//输入窗口的类名,其实需要是注册过的类名才行,否则是要报错或者查找失败的。
LPCTSTR lpszWindowName//输入窗口的名称,就是窗口上面蓝色的那行玩意儿写的字。
);
//如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。
HWND FindWindowEx(
HWND hwndParent,//要查找的子窗口所在的父窗口的句柄
HWND hwndChildAfter,//子窗口句柄
LPCTSTR lpszClass,//指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针
LPCTSTR lpszWindow//指向一个指定了窗口名(窗口标题)的空结束字符串。
);
返回值:
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。
②函数将指定的消息发送到一个或多个窗口。
LRESULT SendMessageA(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
/*
hWnd:指定要接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。32位的窗口句柄。
Msg:指定被发送的消息。这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。 消息详情点这里
wParam:指定附加的消息特定信息。通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
IParam:指定附加的消息特定信息。通常是一个指向内存中数据的指针。
*/
LRESULT SendMessageW(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
返回值:返回值指定消息处理的结果;这取决于发送的消息。
③将消息放在与创建指定窗口的线程关联的消息队列中,并在不等待线程处理消息的情况下返回。
BOOL PostMessageA(
HWND hWnd,//窗口的句柄,其窗口过程是接收消息。
UINT Msg,//要发布的邮件。有关系统提供的消息的列表,
WPARAM wParam,//其他特定于消息的信息。
LPARAM lParam//其他特定于消息的信息。
);
/*
HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、 被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样
*/
BOOL PostMessageW(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
返回值:如果函数成功,则返回值为非零。如果函数失败,则返回值为零。要获取扩展的错误信息,请致电GetLastError。GetLastError在达到限制时返回ERROR_NOT_ENOUGH_QUOTA。
④确定给定窗口的可见性状态。
BOOL IsWindowVisible() const;
⑤确定指定的窗口句柄是否标识现有窗口。
BOOL IsWindow() throw();
⑥对指定的窗口设置键盘焦点
HWND SetFocus(HWND hWnd);
返回值:若函数调用成功,则返回原先拥有键盘焦点的窗口句柄。若hWnd参数无效或窗口未与调用线程的消息队列相关,则返回值为NULL。若想要获得更多错误信息,可以调用GetLastError函数。
备注:SetFocus函数发送WM_KILLFOCUS消息到失去键盘焦点的窗口,并且发送WM_SETFOCUS消息到接受键盘焦点的窗口。它也激活接受键盘焦点的窗口或接受键盘焦点的窗口的父窗口。
⑦系统计时器
1. UINT SetTimer(
UINT nIDEvent,
UINT nElapse,
void (CALLBACK* lpfnTimer)(HWND, UINT, UINT, DWORD) = NULL) throw();
/*
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
*/
例如:SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
/*
nIDEvent
指定非零计时器标识符。 如果计时器标识符是唯一的,则 返回相同的值 SetTimer 。 否则, SetTimer 将确定新的唯一值并返回该值。 对于具有回调函数 (窗口计时器) ,该值必须仅对与当前窗口关联的其他 NULL 窗口计时器唯一。 对于回调计时器,该值对于所有进程中的所有计时器都必须是唯一的。 因此,创建回调计时器时,返回的值很可能不同于指定的值。
nElapse
指定以毫秒为单位的超时值或间隔。
lpfnTimer
指定处理消息的应用程序提供的 TimerProc 回调函数 WM_TIMER 的地址。如果此参数 NULL 为,WM_TIMER 则消息将放置在应用程序的消息队列中,由对象 CWnd 处理。
*/
返回值:如果函数成功,则新计时器的计时器标识符。此值不一定等于通过 参数传入 nIDEvent 的值。 应用程序应始终将返回值传递给 KillTimer 成员函数以终止计时器。 如果成功,则为非零;否则为 0。
2. BOOL KillTimer(UINT nIDEvent) throw();
//传递给的计时器事件的值 SetTimer 。
返回值:指定函数的结果。 如果事件已发生,则该值为非零值。 如果成员函数找不到指定的计时器 KillTimer 事件,则为 0。
⑧线程函数
CWinThread* AFXAPI AfxBeginThread
(
AFX_THREADPROC pfnThreadProc, //参数1
LPVOID pParam, //参数2
int nPriority, //参数3
UINT nStackSize, //参数4
DWORD dwCreateFlags, //参数5
LPSECURITY_ATTRIBUTES lpSecurityAttrs //参数6
);
/*
参数1:是从CWinThread派生的RUNTIME_CLASS类;
参数2:指定线程优先级,如果为0,则与创建该线程的线程相同;
参数3:指定线程的堆栈大小,如果为0,则与创建该线程的线程相同;
参数4:是一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。
参数5:表示线程的安全属性,NT下有用。
*/
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
/*
n长度
此结构的大小(以字节为单位)。将此值设置为SECURITY_ATTRIBUTES结构的大小。
lpSecurityDescriptor
指向控制对象访问的SECURITY_DESCRIPTOR结构的指针。如果此成员的值为NULL,则为对象分配与调用进程的访问令牌关联的默认安全描述符。这与通过分配NULL 任意访问控制列表(DACL) 向所有人授予访问权限不同。默认情况下,进程的访问令牌中的默认 DACL 仅允许访问令牌所表示的用户进行访问。
bHeritHandle
一个布尔值,该值指定在创建新进程时是否继承返回的句柄。如果此成员为TRUE,则新进程将继承句柄。
*/