获取进程标识符始终返回0

问题描述 投票:0回答:1

因此,此代码在此始终为我的进程标识符返回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;

}

我觉得答案就在我眼前,由于某种原因我无法弄清楚……

c++ windows winapi
1个回答
0
投票

带有字符串参数的Windows API函数有三种变体,一种带有窄字符串(char),另一种带有宽字符串(wchar_t),另一种带有窄或宽,取决于UNICODE宏设置([ C0])。

始终使用窄字符串的函数可以在函数名称的末尾由tchar_t标识,始终使用A进行宽字符串的函数。

您正在使用变量类型的变体,并且显然W设置已为您更改,因为您说代码以前可以工作。但是,我确定您稍后添加了UNICODE强制转换,因为在任何一种情况下该强制转换都是错误的。

[(LPCWSTR)将窄字符串重新解释为宽字符串,实际上它并未根据某些明智的编码将宽字符转换为窄字符。

因此,在最佳情况下,您将(LPCWSTR)windowName乱码作为窗口名称,或更糟糕的是,您将具有未定义的行为。

如果传递狭窄的字符串,请使用适当的功能:

FindWindow
© www.soinside.com 2019 - 2024. All rights reserved.