因此,此代码在此始终为我的进程标识符返回0。我尝试使用其他函数来获取进程标识符,该函数在我之前也能正常工作,但它也返回0。我也尝试了其他进程名称,但没有任何作用。我尝试调试它,发现将pID初始化为0时,该函数返回0。我认为这是因为FindWindowA的HWND某种程度上是无效的,因此GetWindowThreadProcessId()并未将我的pID变量设置为进程ID,因此它仍为0。同样,当我只定义pID时,我的函数返回的不是pid的随机数(垃圾内存,因为它没有初始化,就好像来自FindWindow的句柄无效,因此在GetWindowThreadProcessId()处没有向我的变量pID分配任何进程标识符) 。我认为这与FindWindow函数有关,但是我尝试放入其他进程名称,并且没有变化。我可以使用PROCESSENTRY32,但我想知道这是怎么回事。
::std::uint32_t GetPID(const char* windowName)
{
::std::uint32_t pID; // when this is initialized to 0, my function returns 0 otherwise it returns rand
HWND hWindow = FindWindow(NULL, (LPCWSTR)windowName);
GetWindowThreadProcessId(hWindow, &pID);
return pID;
}
我觉得答案就在我眼前,由于某种原因我无法弄清楚……
带有字符串参数的Windows API函数有三种变体,一种带有窄字符串(char
),另一种带有宽字符串(wchar_t
),另一种带有窄或宽,取决于UNICODE
宏设置([ C0])。
始终使用窄字符串的函数可以在函数名称的末尾由tchar_t
标识,始终使用A
进行宽字符串的函数。
您正在使用变量类型的变体,并且显然W
设置已为您更改,因为您说代码以前可以工作。但是,我确定您稍后添加了UNICODE
强制转换,因为在任何一种情况下该强制转换都是错误的。
[(LPCWSTR)
将窄字符串重新解释为宽字符串,实际上它并未根据某些明智的编码将宽字符转换为窄字符。
因此,在最佳情况下,您将(LPCWSTR)windowName
乱码作为窗口名称,或更糟糕的是,您将具有未定义的行为。
如果传递狭窄的字符串,请使用适当的功能:
FindWindow