如何做英文網(wǎng)站的外鏈廈門百度競價推廣
Qt/C++ 獲取QProcess啟動的第三方軟件的窗體標題,在使用EnumWindows獲取窗體句柄(HWND)時,如果返回提前FALSE,則獲取到的HWND狀態(tài)IsWindow正常,但就是獲取不到窗體標題。必須正常返回TRUE才能使用HWND獲取到窗體標題,要不然獲取到的標題內(nèi)容就是空。
QProcess線程需要在啟動后等待幾秒的時間再獲取打開的窗體句柄,或者一直While(true)獲取窗體句柄直到獲取HWND不為空為止。
目錄
- 使用EnumWindows獲取所有窗體句柄和PID
- 寫法1
- 寫法2
- 獲取窗體標題
- 使用 GetWindowTextA 獲取窗體標題
- 使用 SendMessage獲取窗體標題
- 使用 DefWindowProcA獲取窗體標題
- 使用 GetClassNameA獲取窗體類名稱
- 使用FindWindowEx獲取窗體句柄
使用EnumWindows獲取所有窗體句柄和PID
寫法1
static HWND GHO_HWMD_C=nullptr;
static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{DWORD processId;GetWindowThreadProcessId(hwnd, &processId);if (processId == (DWORD)lParam){GHO_HWMD_C=hwnd;}///必須返回true 如果返回false 會造成HWND不能獲取窗體標題,修改窗體隱藏等屬性return TRUE;
}static BOOL CALLBACK EnumThreadChildProc(HWND hwnd, LPARAM lParam)
{DWORD processId;GetWindowThreadProcessId(hwnd, &processId);if (processId == (DWORD)lParam){GHO_HWMD_C=hwnd;}///必須返回true 如果返回false 會造成HWND不能獲取窗體標題,修改窗體隱藏等屬性return TRUE;
}static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{DWORD processId;GetWindowThreadProcessId(hwnd, &processId);if (processId == (DWORD)lParam){GHO_HWMD_C=hwnd;}///必須返回true 如果返回false 會造成HWND不能獲取窗體標題,修改窗體隱藏等屬性return TRUE;EnumChildWindows(hwnd, EnumChildProc, lParam);EnumThreadWindows(processId,EnumThreadChildProc, lParam);
}//在所有線程中查找pid
//process.processId(); QProcess類processId()返回pid
EnumWindows(EnumWindowsProc, (LPARAM)process.processId());
寫法2
EnumWindows([](HWND hwndparent, LPARAM lParam)->BOOL{DWORD processId = 0;GetWindowThreadProcessId(hwndparent, &processId);if (processId == (DWORD)lParam){GHO_HWMD_C=hwnd;}EnumChildWindows(hwndparent,[](HWND Chwnd, LPARAM lParam)->BOOL{DWORD CprocessId = 0;GetWindowThreadProcessId(Chwnd, &CprocessId);if (CprocessId == (DWORD)lParam){GHO_HWMD_C=hwnd;}return TRUE; // 返回TRUE以繼續(xù)枚舉下一個窗體},lParam);EnumThreadWindows(processId,[](HWND Thwnd, LPARAM lParam)->BOOL{DWORD TprocessId = 0;GetWindowThreadProcessId(Thwnd, &TprocessId);if (TprocessId == (DWORD)lParam){GHO_HWMD_C=hwnd;}return TRUE; // 返回TRUE以繼續(xù)枚舉下一個窗體},lParam);return TRUE; // 返回TRUE以繼續(xù)枚舉下一個窗體},(LPARAM)process.processId());
獲取窗體標題
使用 GetWindowTextA 獲取窗體標題
char WindowText[256];
GetWindowTextA(GHO_HWMD_C, WindowText, sizeof(WindowText));
qDebug() << "Window title Text: " << QString::fromUtf8(WindowText);
使用 SendMessage獲取窗體標題
WCHAR WindowsTitle[MAX_PATH];
if(SendMessageW(GHO_HWMD_C, WM_GETTEXT, MAX_PATH, (LPARAM)WindowsTitle)>0)qDebug() <<QString::fromWCharArray(WindowsTitle);//const int bufferSize = 256;//char buffer[bufferSize];//SendMessageA(GHO_HWMD_C, WM_GETTEXT, bufferSize, (LPARAM)buffer)
使用 DefWindowProcA獲取窗體標題
int len = SendMessageA(GHO_HWMD_C, WM_GETTEXTLENGTH, 0, 0) + 1;
// new一塊len大小的內(nèi)存
char *title = new char(len);
// 初始化內(nèi)存為0
memset(title, 0, len);
// 發(fā)送WM_GETTEXT消息獲取控件文本
DefWindowProcA(GHO_HWMD_C, WM_GETTEXT, 1024, (LPARAM)title);
使用 GetClassNameA獲取窗體類名稱
char className[256];
GetClassNameA(GHO_HWMD_C, className, sizeof(className));
qDebug() << "Window class name: " << QString::fromUtf8(className);
使用FindWindowEx獲取窗體句柄
/*! https://linuxcpp.0voice.com/?id=132468*/
/*!
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QProcess process;process.start("path/to/your/executable");if (process.waitForStarted()){// 獲取進程IDDWORD pid = process.processId();// 獲取進程主窗口句柄HWND hwnd = nullptr;do{hwnd = FindWindowEx(nullptr, hwnd, nullptr, nullptr);DWORD windowPid;GetWindowThreadProcessId(hwnd, &windowPid);if (windowPid == pid){// 獲取窗口類名char className[256];GetClassName(hwnd, className, sizeof(className));qDebug() << "Window class name: " << QString::fromUtf8(className);break;}} while (hwnd != nullptr);process.waitForFinished();}return a.exec();
}*/