0

我尝试使用 Wisual Studio 2012、c++ 控制台应用程序打开进程并得到 87 错误:

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

EXTERN_DLL_EXPORT int setLastObject(LPCWSTR wname) {
    LPCWSTR str = _TEXT("Name of window");
    HWND wnd = FindWindow(NULL,wname);

    LPDWORD cpid = 0;
    DWORD pid = GetWindowThreadProcessId(wnd,cpid);

    HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS,false,pid);
    int err = GetLastError();
    return err;
}

PS我得到正确的pid

4

1 回答 1

1

该函数返回创建窗口的线程GetWindowThreadProcessId的 ID 。

您需要使用相应的进程 id,它在第二个参数中返回。所以像这样

EXTERN_DLL_EXPORT int setLastObject(LPCWSTR wname) {
    LPCWSTR str = _TEXT("Name of window");
    HWND wnd = FindWindow(NULL,wname);

    DWORD dwProcessId = 0;
    DWORD dwThreadId = GetWindowThreadProcessId(wnd, &dwProcessId);

    HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessId);
    int err = GetLastError();
    return err;
}

此外,您真的应该检查是否FindWindow已成功,如果您确实获得了有效的HANDLE,您必须记住CloseHandle何时完成它。

于 2013-05-23T13:00:29.250 回答