0
我想獲取當前Chrome版本的當前網址。如何獲取鉻當前版本的當前網址
所以,我試着用這種方式。 (http://www.codeproject.com/Questions/648906/how-to-get-current-URL-for-chrome-ver-29)
此方法現在可用。
但是,只有在單擊該選項卡時纔可能。
我想要獲得點擊任何地方的chrome URL。
有可能嗎?謝謝。
我想獲取當前Chrome版本的當前網址。如何獲取鉻當前版本的當前網址
所以,我試着用這種方式。 (http://www.codeproject.com/Questions/648906/how-to-get-current-URL-for-chrome-ver-29)
此方法現在可用。
但是,只有在單擊該選項卡時纔可能。
我想要獲得點擊任何地方的chrome URL。
有可能嗎?謝謝。
這是一個老問題,但它經常在這裏問,所以我會提供我的解決方案。
您提供的鏈接存在的問題是,EVENT_OBJECT_VALUECHANGE
不是您應該關注的唯一事件,因爲還有其他幾個可能表明網址更改的事件(例如更改標籤)。因此,我們將觀察EVENT_OBJECT_FOCUS
和EVENT_OBJECT_VALUECHANGE
之間的所有事件。以下是一個示例:
HWINEVENTHOOK LHook = 0;
void CALLBACK WinEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) {
IAccessible* pAcc = NULL;
VARIANT varChild;
if ((AccessibleObjectFromEvent(hwnd, idObject, idChild, &pAcc, &varChild) == S_OK) && (pAcc != NULL)) {
char className[50];
if (GetClassName(hwnd, className, 50) && strcmp(className, "Chrome_WidgetWin_1") == 0) {
BSTR bstrName = nullptr;
if (pAcc->get_accName(varChild, &bstrName) == S_OK) {
if (wcscmp(bstrName, L"Address and search bar") == 0) {
BSTR bstrValue = nullptr;
if (pAcc->get_accValue(varChild, &bstrValue) == S_OK) {
printf("URL change: %ls\n", bstrValue);
SysFreeString(bstrValue);
}
}
SysFreeString(bstrName);
}
pAcc->Release();
}
}
}
void Hook() {
if (LHook != 0) return;
CoInitialize(NULL);
LHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_VALUECHANGE, 0, WinEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS);
}
void Unhook() {
if (LHook == 0) return;
UnhookWinEvent(LHook);
CoUninitialize();
}
int main(int argc, const char* argv[]) {
MSG msg;
Hook();
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Unhook();
return 0;
}
這將報告控制檯中所有Chrome地址欄的更改。
請注意這裏的內存泄漏:'bstrValue'和'bstrName'永遠不會被釋放。必須調用'SysFreeString()',因爲'BSTR'是通過'SysAllocString()'分配的。此外,爲了使代碼更健壯,變量應該像這樣被初始化:'BSTR bstrName = nullptr,bstrValue = nullptr;' – zett42
另外,如果'GetClassName()'失敗,下面的'strcmp()'可能會在運行時崩潰未初始化的內存,因此必須檢查GetClassName()的返回值,或者必須對'className'數組進行零初始化。類似地,如果'get_accValue()'和/或'get_accName()'失敗,'wcscmp(bstrName,...)'和'printf'可能會崩潰,因此必須進行適當的檢查以防止出現這種情況。 – zett42
謝謝 - 更新以解決這些問題。 – fstanis