windows下在进程中使用createprocess创建一个窗口进程,并获取这个窗口HWND句柄 [操作系统入门]
windows 下在一个进程中使用createprocess创建一个窗口进程,并获取这个窗口的HWND句柄
C++使用createprocess创建一个窗口进程,并获取这个窗口的HWND句柄。
主要思路是:
- 定义getDwProcessId函数,用于监听创建子窗口的活动。
- 定义EnumWindowsProcGetWndTitle回调函数,用于捕获子窗口句柄。
- 把捕获的句柄赋值给全局变量,用于主函数执行子窗口操作。
图例如下:
示例如下:
程序入口点代码
```c++
//zhaoanan
#pragma warning (disable : 4786)
#include "stdafx.h"
#include <stdlib.h>
#include <winsock2.h>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <stdio.h>
#include <windows.h>
#include "RemoteCompileSFunc.h"
#pragma comment(lib, "Kernel32.lib")
using namespace std;
#define RECEIVE_BUFFER_LEN 50
#pragma comment(lib,"ws2_32.lib")
void Build80Zc(const string& sExe, const string& sPath, const string& sCmd);
BOOL CALLBACK EnumWindowsProcGetWndTitle(HWND hWnd, LPARAM lParam);
DWORD getDwProcessId(DWORD g_dwProcessId);
HWND g_hWnd = NULL;
int main(int argc, char* argv[])
{
//执行make clean ab命令
Build80Zc("C:WindRiver3wrenv.exe -p vxworks-cert-6.6.3.1", "cd C:srcworkspaceFAO_ZC_VXW_AB_TESTcert", "make clean >> C:srcworkspaceFAO_ZC_VXW_AB_TESTcompile.txt");
//执行make all ab命令
Build80Zc("C:WindRiver3wrenv.exe -p vxworks-cert-6.6.3.1", "cd C:srcworkspaceFAO_ZC_VXW_AB_TESTcert", "make all >> C:srcworkspaceFAO_ZC_VXW_AB_TESTcompile.txt");
//执行make clean c命令
Build80Zc("C:WindRiverwrenv.exe -p vxworks-6.9","cd C:srcworkspacedtsAppSIMNTdiab_SMP","make clean>>C:srcworkspacedtsAppcompile.txt");
//执行make all c命令
Build80Zc("C:WindRiverwrenv.exe -p vxworks-6.9","cd C:srcworkspacedtsAppSIMNTdiab_SMP","make all>>C:srcworkspacedtsAppcompile.txt");
return 0;
}
BOOL CALLBACK EnumWindowsProcGetWndTitle(HWND hWnd, LPARAM lParam)
{
DWORD ProcID = 0;
GetWindowThreadProcessId(hWnd, &ProcID);
cout << "传入窗口的进程id:" << lParam << "当前窗口的进程id:" << ProcID << endl;
cout << "当前窗口句柄:" << hWnd << endl;
if (ProcID == lParam)//如果窗口的processid等于你的ID
{
HWND pWnd = GetParent(hWnd);
cout << "第一父窗口句柄:" << pWnd << endl;
while (GetParent(pWnd) != NULL)//得到父窗口的句柄
{
pWnd = GetParent(pWnd);
cout << "父窗口句柄:" << pWnd << endl;
}
if (pWnd != NULL)
{
g_hWnd = pWnd;
} else
{
g_hWnd = hWnd;
}
cout << "最终父窗口句柄:" << g_hWnd << endl;
//ok ?pWnd 就是主窗口了。
return FALSE;
}
return TRUE;
}
DWORD getDwProcessId(DWORD g_dwProcessId)
{
int nNumberDely = 1000;
// 等待窗口动行起,获取到窗口HWND
while(EnumWindows(EnumWindowsProcGetWndTitle,g_dwProcessId) && nNumberDely>0 )
{
nNumberDely--;
}
return g_dwProcessId;
}
void Build80Zc(const string& sExe, const string& sPath, const string& sCmd)
{
string::size_type idx;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
idx = sPath.find("FAO_ZC_VXW_AB_TEST");
if (idx == string::npos){
CreateProcess(NULL, "C:WindRiverwrenv.exe -p vxworks-6.9", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
cout << "打开C机编译器" << endl;
}
else{
CreateProcess(NULL, "C:WindRiver3wrenv.exe -p vxworks-cert-6.6.3.1", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
cout << "打开AB机编译器" << endl;
}
Sleep(1000);
DWORD g_dwProcessId = pi.dwProcessId;
DWORD dwProcessId = getDwProcessId(g_dwProcessId);
//查找当前窗口句柄需要一定的枚举时间,经过测试5s之内能枚举完成
Sleep(5000);
char* buf = (char*)sPath.c_str();
int i;
for (i = 0; i < strlen(buf); i++)
{
::SendMessage(g_hWnd, WM_IME_CHAR, buf[i], 0);
}
::SendMessage(g_hWnd, WM_IME_CHAR, 13, 0);
Sleep(1000);
buf = (char*)sCmd.c_str();
for (i = 0; i < strlen(buf); i++)
{
::SendMessage(g_hWnd, WM_IME_CHAR, buf[i], 0);
}
::SendMessage(g_hWnd, WM_IME_CHAR, 13, 0);
idx = sCmd.find("clean");
if (idx == string::npos){
Sleep(120000);
}
else{Sleep(5000); }
const string& gaoci = "exit";
buf = (char*)gaoci.c_str();
for (i = 0; i < strlen(buf); i++)
{
::SendMessage(g_hWnd, WM_IME_CHAR, buf[i], 0);
}
::SendMessage(g_hWnd, WM_IME_CHAR, 13, 0);
//终止进程
if (pi.hProcess)
{
cout << "开始关闭编译器" << endl;
DWORD dwEC = 0;
BOOL b = GetExitCodeProcess(pi.hProcess, &dwEC);
if (b)
{
if (!TerminateProcess(pi.hProcess, dwEC))
{ cout << "强行关闭编译器" << endl; }
}
CloseHandle(pi.hProcess);
cout << "关闭编译器成功" << endl;
}
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
}
定义getDwProcessId函数,用于监听创建子窗口的活动:
```c++
//监听创建子窗口的活动
DWORD getDwProcessId(DWORD g_dwProcessId)
{
int nNumberDely = 1000;
// 等待窗口动行起,获取到窗口HWND
while(EnumWindows(EnumWindowsProcGetWndTitle,g_dwProcessId) && nNumberDely>0 )
{
nNumberDely--;
}
return g_dwProcessId;
}
定义EnumWindowsProcGetWndTitle回调函数,用于捕获子窗口句柄:
```c++
//定义EnumWindowsProcGetWndTitle回调函数,用于捕获子窗口句柄
BOOL CALLBACK EnumWindowsProcGetWndTitle(HWND hWnd, LPARAM lParam)
{
DWORD ProcID = 0;
GetWindowThreadProcessId(hWnd, &ProcID);
cout << "传入窗口的进程id:" << lParam << "当前窗口的进程id:" << ProcID << endl;
cout << "当前窗口句柄:" << hWnd << endl;
if (ProcID == lParam)//如果窗口的processid等于你的ID
{
HWND pWnd = GetParent(hWnd);
cout << "第一父窗口句柄:" << pWnd << endl;
while (GetParent(pWnd) != NULL)//得到父窗口的句柄
{
pWnd = GetParent(pWnd);
cout << "父窗口句柄:" << pWnd << endl;
}
if (pWnd != NULL)
{
g_hWnd = pWnd;
} else
{
g_hWnd = hWnd;
}
cout << "最终父窗口句柄:" << g_hWnd << endl;
//ok ?pWnd 就是主窗口了。
return FALSE;
}
return TRUE;
}
参考意见和网页地址:
- https://blog.csdn.net/moshang005/article/details/37932455
windows 下在进程中使用createprocess创建一个窗口进程,并获取这个窗口HWND句柄
以上是 windows下在进程中使用createprocess创建一个窗口进程,并获取这个窗口HWND句柄 [操作系统入门] 的全部内容, 来源链接: utcz.com/z/519373.html