C语言成长之路37:闪现的QQ
声明:本笔记基于 B站UP主「来自程序员的暴击」的 「C语言成长之路」中对应课程;
本次使用到的未接触过的函数:
SetWindowPos(HWND hWnd,HWND hWndInsertAfter,int X,int Y,int cx, int cy, UINT uFlags);
HWND hWnd:在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄;
HWND hWndInsertAfter:
用于标识在z-顺序的此 CWnd 对象之前的 CWnd 对象。如果uFlags参数中设置了SWP_NOZORDER标记则本参数将被忽略。可为下列值之一:
-
HWND_BOTTOM:值为1,将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
-
HWND_NOTOPMOST:值为-2,将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
-
HWND_TOP:值为0,将窗口置于Z序的顶部。
-
HWND_TOPMOST:值为-1,将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。
X:以客户坐标指定窗口新位置的左边界。
Y:以客户坐标指定窗口新位置的顶边界。
cx:以像素指定窗口的新的宽度。
cy:以像素指定窗口的新的高度。
uFlags:窗口尺寸和定位的标志。该参数可以是下列值的组合:
-
SWP_ASYNCWINDOWPOS:如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁。
-
SWP_DEFERERASE:防止产生WM_SYNCPAINT消息。
-
SWP_DRAWFRAME:在窗口周围画一个边框(定义在窗口类描述中)。
-
SWP_FRAMECHANGED:给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。
-
SWP_HIDEWINDOW;隐藏窗口。
-
SWP_NOACTIVATE:不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。
-
SWP_NOCOPYBITS:清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。
-
SWP_NOMOVE:维持当前位置(忽略X和Y参数)。
-
SWP_NOOWNERZORDER:不改变z序中的所有者窗口的位置。
-
SWP_NOREDRAW:不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。
-
SWP_NOREPOSITION:与SWP_NOOWNERZORDER标志相同。
-
SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。
-
SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)。
-
SWP_NOZORDER:维持当前Z序(忽略hWndlnsertAfter参数)。
-
SWP_SHOWWINDOW:显示窗口。
说多不如多写一下代码,代码如下(为了好玩,改了一下,运用了goto):
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <limits.h> 4 #include <Windows.h> 5 6 void openQQ(){ 7 ShellExecuteA(0,"open","\"C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQScLauncher.exe\"",0,0,1); 8 } 9 10 void show(){ 11 /* FindWindowA 函数-->通过类名与窗口名去绑定,赋值给HWND类型的window 12 * IpClassName -->需要绑定的类名 13 * IpWindowName-->需要绑定的窗口名字 14 */ 15 HWND window = FindWindowA("TXGuiFoundation","QQ"); 16 if (window == NULL){ 17 printf("Where is QQ?"); 18 } 19 20 int i = 0; 21 int bb = 0; 22 X:printf("gogogo\n"); 23 while (i < 500){ 24 SetWindowPos(window,NULL,400,300,i,i,0); 25 Sleep(50); 26 i+=50; 27 } 28 while (i > 0){ 29 SetWindowPos(window,NULL,400,300,i,i,0); 30 Sleep(50); 31 i-=50; 32 } 33 bb+=10; 34 if (bb < 100){ 35 goto X; 36 } 37 } 38 39 void close(){ 40 system("taskkill /f /im QQ.exe"); 41 } 42 43 int main(){ 44 /* C语言成长之路37:闪现的QQ 45 * 46 */ 47 openQQ(); 48 Sleep(1000); 49 show(); 50 Sleep(1000); 51 close(); 52 }