C ++ - FindWindow win32 API总是失败!

时间:2010-12-19 19:35:26

标签: c++ winapi findwindow

我在C ++中遇到FindWindow()函数的问题。我正在使用两个程序 - 程序A和程序B.两者都是本机代码中的控制台应用程序。 程序A用值初始化int i和string s。程序B使用程序A运行时显示的地址从程序A的内存中读取它们。 目前我只对阅读'i'的价值感兴趣。

我无法让FindWindow()工作但我不知道为什么:/我没有做过多的win32 api编程所以我在这个隔间里很新。

计划A:

#include <Windows.h>
#include <string>
#include <iostream>

using namespace std;

int main() {
    SetConsoleTitle(L"PROGRAM_A");

    string s = "Kuken\0";
    int i = 12345;
    char choice;

    int* ptr_i = &i;
    string* ptr_s = &s;

    cout << "ADDRESSES: \n";
    cout << "Int i: " << ptr_i << "\n";
    cout << "String s: " << ptr_s << "\n\n";

    cout << "INITIAL VALUES: \n";
    cout << "Int i: " << i << "\n";
    cout << "String s: " << s << "\n\n";

    cout << "***Read/Modify this process memory with programB and view new values! \n\n";


    while (true) {
        cout << "Print values of i and s? y/n \n";
        cin >> choice;
        switch (choice) {
        case 'y': 
            cout << "i: " << *ptr_i << "\n";
            cout << "s: " << *ptr_s << "\n";
            break;
        default:
        break;
        }

    }

    return 0;
    }

计划B:

#include <Windows.h>
#include <iostream>
#include <string>



int main() {
    HWND handle_temp;
    unsigned long pid;
    int buffer[1];
    std::wstring name = L"PROGRAM_A";

    int temp;
    int* ptr_i;
    std::string* ptr_s;

    std::cout << "Type the address of i in programA: ";
    std::cin >> std::hex >> temp;
    std::cout << "\n";
    ptr_i = (int*)temp;

    std::cout << "Type the address of s in programA: ";
    std::cin >> std::hex >> temp;
    std::cout << "\n\n";
    ptr_s = (std::string*)temp;

    handle_temp = FindWindow(NULL,name.c_str());
    if (!FindWindow(NULL,name.c_str())) {
        std::cout << "Error: Did not find window \n";
        std::cout << "src: " << ptr_i << "\n";
    }
    GetWindowThreadProcessId(handle_temp,&pid);
    HANDLE handle_prgmA = OpenProcess(PROCESS_VM_READ,0,pid);



    if (ReadProcessMemory(handle_prgmA,ptr_i,&buffer,4,NULL)) {
        std::cout << buffer[0];
    }
    else {
        std::cout << "Could not read memory";

}

CloseHandle(handle_prgmA);

while (true) {
    std::cin >> temp;
}

}

2 个答案:

答案 0 :(得分:4)

这不能完全按照您希望的方式工作。即使FindWindow调用成功:控制台程序创建的窗口。相反,Windows有一个单独的服务器进程来处理控制台窗口的创建,因此多个进程可以共享一个控制台窗口。

相反,我建议您允许直接输入流程ID,例如:从项目经理那里获得后。如果您确实希望按窗口标题查找流程,则需要在流程A中使用CreateWindow

修改:您可以使用EnumProcesses在所有流程列表中查找您的流程。

答案 1 :(得分:0)

IIRC,FindWindow需要一个消息循环才能运行。 由于控制台窗口没有您控制的消息循环,因此它不起作用。