1. 程式人生 > 實用技巧 >C語言成長之路37:閃現的QQ

C語言成長之路37:閃現的QQ

宣告:本筆記基於B站UP主「來自程式設計師的暴擊」的「C語言成長之路」中對應課程;


本次使用到的未接觸過的函式:

SetWindowPos(HWND hWnd,HWND hWndInsertAfter,int X,int Y,int cx, int cy, UINT uFlags);

HWNDhWnd:在z序中的位於被置位的視窗前的視窗控制代碼。該引數必須為一個視窗控制代碼;

HWNDhWndInsertAfter:

用於標識在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:視窗尺寸和定位的標誌。該引數可以是下列值的組合:

  1. SWP_ASYNCWINDOWPOS:如果呼叫程序不擁有視窗,系統會向擁有視窗的執行緒發出需求。這就防止呼叫執行緒在其他執行緒處理需求的時候發生死鎖。
  2. SWP_DEFERERASE:防止產生WM_SYNCPAINT訊息。
  3. SWP_DRAWFRAME:在視窗周圍畫一個邊框(定義在視窗類描述中)。
  4. SWP_FRAMECHANGED:給視窗傳送WM_NCCALCSIZE訊息,即使視窗尺寸沒有改變也會發送該訊息。如果未指定這個標誌,只有在改變了視窗尺寸時才傳送WM_NCCALCSIZE。
  5. SWP_HIDEWINDOW;隱藏視窗。
  6. SWP_NOACTIVATE:不啟用視窗。如果未設定標誌,則視窗被啟用,並被設定到其他最高階視窗或非最高階組的頂部(根據引數hWndlnsertAfter設定)。
  7. SWP_NOCOPYBITS:清除客戶區的所有內容。如果未設定該標誌,客戶區的有效內容被儲存並且在視窗尺寸更新和重定位後拷貝回客戶區。
  8. SWP_NOMOVE:維持當前位置(忽略X和Y引數)。
  9. SWP_NOOWNERZORDER:不改變z序中的所有者視窗的位置。
  10. SWP_NOREDRAW:不重畫改變的內容。如果設定了這個標誌,則不發生任何重畫動作。適用於客戶區和非客戶區(包括標題欄和滾動條)和任何由於窗回移動而露出的父視窗的所有部分。如果設定了這個標誌,應用程式必須明確地使視窗無效並區重畫視窗的任何部分和父視窗需要重畫的部分。
  11. SWP_NOREPOSITION:與SWP_NOOWNERZORDER標誌相同。
  12. SWP_NOSENDCHANGING:防止視窗接收WM_WINDOWPOSCHANGING訊息。
  13. SWP_NOSIZE:維持當前尺寸(忽略cx和Cy引數)。
  14. SWP_NOZORDER:維持當前Z序(忽略hWndlnsertAfter引數)。
  15. 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 }