เช่น GetDC, หรืออาจจะเป็นฟังก์ชั่นพวก WinProc หรือฟังก์ชั่นจัดการกับ message นั่นเอง
แต่.... เราเขียนโปรแกรมแบบ console จะมี Handle ได้อย่างไร
วิธีการมีง่ายๆ เพียง 4-5 ขั้นตอนเท่านั้น
- เรียกใช้ฟังก์ชั่น GetConsoleTitle() เพื่อเก็บค่าของ Title ของวินโดว์ปัจจุบันไว้
- เรียกฟังก์ชั่น SetConsoleTitle() เพื่อเปลี่ยน Title ของ console ที่เราต้องการ
- ให้มัน delay 40 มิลลิวินาที โดยใช้ฟังก์ชั่น Sleep(40) เพื่อให้แน่ใจว่า title ของ โปรแกรมเรา update แล้ว
- เรียกใช้ฟังก์ชั่น FindWindow(NULL, uniquetitle) ฟังก์ชั่นนี้ถือว่าเป็นฟังก์ชั่นหลักเลยทีเดียว เพื่อจะนำค่า HWND ของ โปรแกรมแบบ console หรือแบบ Win32 มา ค่าที่ retune กลัมาจะเป็น HWND หรือ NULL ในกรณีที่มันเกิดการผิดพลาดขึ้น เช่นหาโปรแกรมที่มี Title ตามที่เราต้องการไม่เจอ
- เรียกฟังก์ชั่น SetConsoleTitle() เซ็ทค่าที่ได้จากขั้นตอนที่ 1 ให้มันเหมือนเดิม หรือจะไม่เซ็ทกลับก็ได้
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
//This main function is correctly by standard C
//**returned int not void**
int main(int argc, char *argv[])
{
//Declare Variable
char windowTitle[1024], pszOldTitle[1024], pszNewTitle[1024];
//Step 1
GetConsoleTitle(pszOldTitle, sizeof(pszOldTitle));
cout << "Old Title: " << pszOldTitle << endl; //To test if it captured or not
//We use GetTickCount() and GetCurrentProcessId() for new Title
//it's could be something else you can thinking of such as your name or whatever
//sprinf() to copy value to pszNewTitle which is a char
sprintf(pszNewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId());
//Step 2
//We use SetConsoleTitle() to specified the new Title name for our console
//By passing a char variable (pszNewTitle) which is gived a named
SetConsoleTitle(pszNewTitle);
//Step 3
//Make it sleep or delay by 40 milliseconds
Sleep(40);
//This is a debug to see if new title is set or not
//We use pszNewTitle as the same because of it's not use anymore
//and it could save a little memory but it's not actually good way
GetConsoleTitle(pszNewTitle, sizeof(pszNewTitle));
cout << "New Title: " << pszNewTitle << endl;
//Step 4
// This is the time you will get what you want Console window handle
//To Specified the title value of the window that you want to get a handle
//in the second parameters
HWND consoleHwnd = FindWindow(NULL, pszNewTitle);
//GetWindowText() function to test the handle we got is that we want or not
//by compare with the pszNewTitle ot by calling GetConsoleTitle() function
GetWindowText(consoleHwnd, windowTitle, sizeof(windowTitle));
cout << "Window Title: " << windowTitle << endl;
//This is in <stdlib.h> for paused console to see the value
//if it's not called the console will terminate(Close) immediately
system("PAUSE");
//This MACRO or constance set as 0 for success without error
//or you can return 0
return EXIT_SUCCESS;
}
โค้ดโปรแกรมหลังจากตัด Comment แล้ว
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char *argv[])
{
char windowTitle[1024], pszOldTitle[1024], pszNewTitle[1024];
GetConsoleTitle(pszOldTitle, sizeof(pszOldTitle));
cout << "Old Title: " << pszOldTitle << endl;
sprintf(pszNewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId());
SetConsoleTitle(pszNewTitle);
Sleep(40);
GetConsoleTitle(pszNewTitle, sizeof(pszNewTitle));
cout << "New Title: " << pszNewTitle << endl;
HWND consoleHwnd = FindWindow(NULL, pszNewTitle);
GetWindowText(consoleHwnd, windowTitle, sizeof(windowTitle));
cout << "Window Title: " << windowTitle << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Code ข้างบนนำมาจากการ Export to HTML ของ Dev-C++
แล้วผมไม่ได้ทำ ขั้นตอนที่ 5 นะครับ เพราะ่เห็นว่าได้ผลตามที่ต้องการแล้ว
รูปจากการรันครับ
หากมีข้อผิดพลาดประการใด แนะนำและติชมได้เลยครับ
ที่มา: Microsoft
ความคิดเห็น
แสดงความคิดเห็น