2017-09-16 46 views
-3

我有一個陣列的按鈕,我想監視點擊的hWnds。我也有一系列的HWINEVENTHOOK,我將用它來監控它們。 GetWindowThreadProcessID給我一個LPDWORD進程ID,SetWinEventHook不接受。我不清楚什麼是LPDWORD。請幫忙?C++什麼是LPDWORD?

固定碼下面

謝謝大家誰指出,LPDWORD只是一個指向DWORD。

新代碼:

int i = 0; 
for (HWND hWnd : hWnds) { 
    DWORD processID = 0; 
    DWORD threadID = GetWindowThreadProcessId(hWnd, &processID); 
    hooks[i] = SetWinEventHook(EVENT_OBJECT_INVOKED, EVENT_OBJECT_INVOKED, 
    NULL, 
     WinEventProcCallback, processID, threadID, WINEVENT_OUTOFCONTEXT); 
     i++; 
} 
+3

'DWORD的ProcessID = 0;'和'GetWindowThreadProcessId(HWND,&的ProcessID);'和'SetWinEventHook(EVENT_OBJECT_INVOKED,EVENT_OBJECT_INVOKED, NULL, WinEventProcCallback,的ProcessID,線程ID,WINEVENT_OUTOFCONTEXT);'什麼問題? – user0042

+2

這只是不好的代碼,當你嘗試運行它時會崩潰。您必須使用'DWORD processID'並傳遞'&processID'作爲第二個參數。換句話說,你通過引用傳遞一個DWORD,所以winapi函數可以更新你的變量。匈牙利系統救援,嘿嘿。 –

+1

@HansPassant @HansPassant不是指向地址的引用(即指向) –

回答

1

LPDWORD僅僅是DWORD*和當Windows SDK函數參數是一個「LPsomething」一般需要一個指針傳遞給一個「東西」(除了LP一個typedef [C] [W] STR字符串類型)。

DWORD processID; 
DWORD threadID = GetWindowThreadProcessId(hWnd, &processID); 
if (threadID) 
{ 
    // Do something with threadID and/or processID 
} 

Windows SDK使用Systems Hungarian notation作爲桌面/經典API。

+0

Windows SDK *有時*使用系統匈牙利符號,並非總是如此。例如,'cch'和'cb'前綴顯然是Apps Hungarian符號。大多數COM接口始終使用應用匈牙利語符號。此外,'LP [C] [W | A | T] STR'類* do *指向「某些東西」,即一個零終止的字符數組。 – IInspectable

+0

我從來沒有說過字符串類型不指向任何東西,但在這個問題的上下文中,如果字符串是由被調用的函數分配/設置的,它將是'LPTSTR *'。 – Anders

+0

在這種情況下,您應該對此進行擴展,或者完全刪除該評論。按現狀來看,它留下了太多的解釋空間。 – IInspectable