0

如果我使用 CreateProcess API 函数启动应用程序,如何找到 FindWindow API 调用的 lpClassName 字符串

PROCESS_INFORMATION ProcessInfo; //This is what we get as an [out] parameter

STARTUPINFO StartupInfo; //This is an [in] parameter

ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field

if(CreateProcess("c:\\temp\\application1.exe", NULL,
NULL,NULL,FALSE,0,NULL,
NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
MessageBox("The process could not be started...");
}

我也可以在 FindWindow 中设置部分名称吗?例如,如果我知道应用程序名称是“应用程序<某些版本号>.exe”,那么它可以是:
application1.exe
application1.1.exe
application1.2.1.exe

我的最终目标是使用 Windows 消息系统和 SendMessage API 方法向应用程序发送消息。

4

1 回答 1

0

听起来您真正想要的是您启动的应用程序创建的窗口的句柄。

问题是,您的进程可能会创建许多窗口。您可以使用SetWindowsHookEx函数在进程创建新窗口时收到通知。

未经测试的代码传入:

LRESULT CALLBACK CBTProc(int nCode,  WPARAM wParam,  LPARAM lParam) {
    if(nCode == HCBT_CREATEWND) {
        // wParam is a handle to a window your app just created.
    }
    return 0;
}

CreateProcess("c:\\temp\\application1.exe", NULL,
    NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,
    NULL,&StartupInfo,&ProcessInfo);

SetWindowsHookEx(WH_CBT, procHook, NULL, ProcessInfo.hThread);

ResumeThread(ProcessInfo.hTread);
于 2013-06-05T07:34:25.177 回答