c++ - GetProcessId 失败,错误 6 : The handle is invalid

标签 c++ winapi sendmessage hwnd

我早些时候发布了一个发送消息问题,我们得出的结论是,从 Xchat 获取聊天窗口非常困难。我现在已经转移到 ThrashIRC 并使用 spy++ 能够找到聊天窗口(突出显示):

enter image description here

如您所见,它确实有一个标题,这意味着它确实看到了文本。这是我用来获取 HWND 和文本的代码:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
#include <strsafe.h>

using namespace std;

void FindThrash()
{
    cout << "[ThrashIRC]" << endl;

cout << "| find ThrashIRC window" << endl;
HWND hwndThrashIRC = FindWindow(L"ThrashIRC", NULL);

if (NULL != hwndThrashIRC)
{
    cout << "   + found ThrashIRC window" << endl;
    cout << "| find MDIClient window" << endl;
    HWND hwndMDIClient = FindWindowEx(hwndThrashIRC, NULL, L"MDIClient", NULL);

    if (NULL != hwndMDIClient)
    {

        cout << "   + found MDIClient window" << endl;
        cout << "| find DefChannel window" << endl;
        HWND hwndDefChannel = FindWindowEx(hwndMDIClient, NULL, L"DefChannel", NULL);

        if (NULL != hwndDefChannel)
        {
            cout << "   + found MDIClient window" << endl;
            cout << "| find RichEdit20W window" << endl;
            HWND hwndRichEdit20W = FindWindowEx(hwndDefChannel, NULL, L"RichEdit20W", NULL);

            if (NULL != hwndRichEdit20W)
            {
                cout << "   + found RichEdit20W window" << endl << endl;
                cout << "- get text " << endl;

                const int bufferSize = 32768;
                char textBuffer[bufferSize] = "";
                SendMessage(hwndRichEdit20W, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)textBuffer);

                cout << "[begin text]" << endl;
                cout << textBuffer << endl;
                cout << "[end text]" << endl;

            }
            else
            {
                cerr << "RichEdit20W not found." << endl;
            }




        }
        else
        {
            cerr << "DefChannel not found." << endl;
        }




    }
    else
    {
        cerr << "MDIClient not found." << endl;
    }

}
else
{
    cerr << "ThrashIRC not open." << endl;
}
}

void ErrorExit(LPTSTR lpszFunction)

{



// Retrieve the system error message for the last-error code

LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
DWORD dw = GetLastError();

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER |
    FORMAT_MESSAGE_FROM_SYSTEM |
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    dw,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR)&lpMsgBuf,
    0, NULL);

// Display the error message and exit the process

lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
    (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40)*sizeof(TCHAR));
StringCchPrintf((LPTSTR)lpDisplayBuf,
    LocalSize(lpDisplayBuf) / sizeof(TCHAR),
    TEXT("%s failed with error %d: %s"),
    lpszFunction, dw, lpMsgBuf);
MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);

LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf);
ExitProcess(dw);
}

int main()
{

    FindThrash();
    if (!GetProcessId(NULL))
        ErrorExit(TEXT("GetProcessId"));

    return 0;
}

缓冲区只有那么大,因为 1:我认为缓冲区太小可能是一个错误,并且 2:由于文本量的原因,缓冲区必须很大。任何建议/代码将不胜感激!谢谢!

最佳答案

GetProcessID 期望传递一个有效的进程句柄,如 MSDN documentation 中明确说明的那样.您使用 NULL 作为参数调用它:

if (!GetProcessId(NULL))

当您明确向它提供无效的进程句柄时,为什么您希望它返回任何东西无效的句柄错误?

为了确保您知道,HWND 是窗口句柄,而不是进程句柄。 FindWindowFindWindowEx 返回一个窗口句柄

关于c++ - GetProcessId 失败,错误 6 : The handle is invalid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20927283/

相关文章:

c++ - Netbeans 7.1.2 中的 C++ 分析器在哪里

c++ - 使用 Qt 在 Symbian 中处理多个窗口

c++ - 在 Windows 中使用 MIDI 流时出现问题

c++ - 返回 FALSE 的 WTSQueryUserToken

winapi - 如何将击键发送到窗口而无需使用 Windows API 激活它?

c# - SendMessage - 发送区分大小写的按键

delphi - 如果 Scrollbar.visible := False?,如何通过 .Perform() 或 SendMessage 滚动滚动框

c++ - 从二进制文件中读取 std::string

c++ - Eclipse cdt : Includes header file correct, 编译,但突出显示源代码: "Unresolved inclusion"

c++ - Windows 系统中是否存在未缓冲的 I/O?