วิธีการขอรับหมายเลขอ้างอิงหน้าต่างคอนโซล (HWND)


สรุป


คุณอาจมีประโยชน์ในการจัดการหน้าต่างที่เกี่ยวข้องกับแอปพลิเคชันคอนโซล Win32 API ไม่มีวิธีการโดยตรงสำหรับการขอรับหมายเลขอ้างอิงหน้าต่างที่เชื่อมโยงกับแอปพลิเคชันของคอนโซล อย่างไรก็ตามคุณสามารถขอรับจุดจับหน้าต่างด้วยการโทร FindWindow () ฟังก์ชันนี้จะเรียกใช้จุดจับหน้าต่างที่ยึดตามชื่อชั้นเรียนหรือชื่อหน้าต่าง โทร GetConsoleTitle () เพื่อกำหนดชื่อของคอนโซลปัจจุบัน จากนั้นจัดหาชื่อคอนโซลปัจจุบันไปยัง FindWindow ()

ข้อมูลเพิ่มเติม


เนื่องจากหลายหน้าต่างอาจมีชื่อเดียวกันคุณควรเปลี่ยนชื่อเรื่องของหน้าต่างคอนโซลปัจจุบันเป็นชื่อที่ไม่ซ้ำกัน การทำเช่นนี้จะช่วยป้องกันไม่ให้มีการส่งกลับจุดจับของหน้าต่างที่ไม่ถูกต้อง ใช้ SetConsoleTitle () เพื่อเปลี่ยนชื่อเรื่องของหน้าต่างคอนโซลปัจจุบัน ต่อไปนี้คือกระบวนการ:
  1. โทร GetConsoleTitle () เพื่อบันทึกชื่อเรื่องของหน้าต่างคอนโซลปัจจุบัน
  2. โทร SetConsoleTitle () เมื่อต้องการเปลี่ยนชื่อคอนโซลให้เป็นชื่อที่ไม่ซ้ำกัน
  3. โทร (40) เพื่อให้แน่ใจว่าชื่อของหน้าต่างได้รับการอัปเดต
  4. โทร FindWindow (NULL, uniquetitle) เพื่อรับ HWND การโทรนี้จะส่งกลับ HWND หรือ NULL ถ้าการดำเนินการล้มเหลว
  5. โทร SetConsoleTitle () ด้วยค่าที่ดึงมาจากขั้นตอนที่1เพื่อคืนค่าชื่อเรื่องของหน้าต่างต้นฉบับ
คุณควรทดสอบ HWND ที่เป็นผลลัพธ์ ตัวอย่างเช่นคุณสามารถทดสอบเพื่อดูว่า HWND ที่ส่งกลับสอดคล้องกับกระบวนการปัจจุบันด้วยการโทร GetWindowText () บน HWND และเปรียบเทียบผลลัพธ์กับ GetConsoleTitle () HWND ที่เป็นผลลัพธ์ไม่ได้รับการรับรองให้เหมาะสมกับการดำเนินการจัดการหน้าต่างทั้งหมด

โค้ดตัวอย่าง

ฟังก์ชันต่อไปนี้จะดึงข้อมูลจุดจับของหน้าต่างแอปพลิเคชันคอนโซลปัจจุบัน (HWND) ถ้าฟังก์ชันสำเร็จค่าส่งกลับจะเป็นจุดจับของหน้าต่างคอนโซล ถ้าฟังก์ชันล้มเหลวค่าส่งกลับจะเป็น NULL การตรวจสอบข้อผิดพลาดบางอย่างจะถูกเว้นไว้สำหรับความ
   HWND GetConsoleHwnd(void)   {       #define MY_BUFSIZE 1024 // Buffer size for console window titles.       HWND hwndFound;         // This is what is returned to the caller.       char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated                                           // WindowTitle.       char pszOldWindowTitle[MY_BUFSIZE]; // Contains original                                           // WindowTitle.       // Fetch current window title.       GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);       // Format a "unique" NewWindowTitle.       wsprintf(pszNewWindowTitle,"%d/%d",                   GetTickCount(),                   GetCurrentProcessId());       // Change current window title.       SetConsoleTitle(pszNewWindowTitle);       // Ensure window title has been updated.       Sleep(40);       // Look for NewWindowTitle.       hwndFound=FindWindow(NULL, pszNewWindowTitle);       // Restore original window title.       SetConsoleTitle(pszOldWindowTitle);       return(hwndFound);   }