Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;LPDWORD的正确用法_C++_Winapi - Fatal编程技术网

C++ C++;LPDWORD的正确用法

C++ C++;LPDWORD的正确用法,c++,winapi,C++,Winapi,我有一个按钮的HWND数组,我想监控点击。我还有一系列的HwineVenthook,我将使用它们来监视它们。GetWindowThreadProcessID为我提供了一个LPDWORD进程ID,SetWinEventHook不接受该ID。我不清楚在本例中是否正确使用了LPDWORDs。谁能给我指一下正确的方向吗 编辑:谢谢大家的贡献,我已经发布了下面更正的代码 新代码: int i = 0; for (HWND hWnd : hWnds) { DWORD processID = 0;

我有一个按钮的HWND数组,我想监控点击。我还有一系列的HwineVenthook,我将使用它们来监视它们。GetWindowThreadProcessID为我提供了一个LPDWORD进程ID,SetWinEventHook不接受该ID。我不清楚在本例中是否正确使用了LPDWORDs。谁能给我指一下正确的方向吗

编辑:谢谢大家的贡献,我已经发布了下面更正的代码

新代码:

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++;
}

LPDWORD
只是
DWORD*
的类型定义,当Windows SDK函数参数是“LPsomething”时,通常需要传递指向“something”的指针(LP[C][W]STR字符串类型除外)


Windows SDK用于桌面/经典API。

DWORD processID=0
GetWindowThreadProcessId(hWnd和&processID)
SetWinEventHook(调用了EVENT\u OBJECT\u,调用了EVENT\u OBJECT\u,NULL,WinEventProcCallback,processID,threadID,WINEVENT\u OUTOFCONTEXT)问题出在哪里?它只是坏代码,当您尝试运行它时会崩溃。第二个参数必须使用
DWORD processID
并传递
&processID
。换句话说,您正在通过引用传递DWORD,以便winapi函数可以更新您的变量。Hungarian System to the rescue,呵呵。@HansPassant那不是一个地址(即指向的指针)的引用@WilliamJones:Hans正在解释,by引用习惯用法是如何在C中实现的(通过获取一个变量的地址)。这是指该评论前面的一句话。Windows SDK有时使用Systems匈牙利符号,但并不总是如此。例如,
cch
cb
前缀显然是匈牙利符号。大多数COM接口都使用匈牙利符号。此外,
LP[C][W | A | T]STR
类型确实指向“某物”,即以零结尾的字符数组。我从来没有说过字符串类型不指向任何东西,但在这个问题的上下文中,如果字符串是由被调用函数分配/设置的,那么它将是
LPTSTR*
。在这种情况下,您应该对此进行扩展,或者完全放弃那句话。就目前情况而言,它给解释留下了太多的空间。
DWORD processID;
DWORD threadID = GetWindowThreadProcessId(hWnd, &processID);
if (threadID)
{
  // Do something with threadID and/or processID
}