windows 下在一个进程中使用createprocess创建一个窗口进程,并获取这个窗口的HWND句柄

来源:互联网 发布:新农合软件 编辑:程序博客网 时间:2024/04/30 14:44
// Process.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include <windows.h> 
#include <iostream>


DWORD g_dwProcessId = 0;
HWND g_hWnd = NULL;
BOOL   CALLBACK  EnumWindowsProcGetWndTitle(HWND hWnd,LPARAM lParam);
bool CloseProcess(DWORD pid);
DWORD InitCreateProcess(TCHAR* cmdline);
DWORD InitCreateProcess(TCHAR* cmdline)
{


TCHAR chPath[301];
int nNumberDely = 1000;
::GetCurrentDirectory(300,(LPTSTR)chPath);//得到当前目录
wcscat(chPath,cmdline);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
if(CreateProcess(chPath,L"", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
else 
{
MessageBox(NULL,L"创建失败!",L"ERROR!",MB_OK);
HANDLE hProcess = GetCurrentProcess();//get current process
TerminateProcess(hProcess,0);         //close process
}
g_dwProcessId = pi.dwProcessId;
// 等待窗口动行起,获取到窗口HWND
while(EnumWindows(EnumWindowsProcGetWndTitle,g_dwProcessId) && nNumberDely>0 )
{
nNumberDely--;
}
return pi.dwProcessId;
}


bool CloseProcess(DWORD pid)
{
bool result=false;
HANDLE hprocess=OpenProcess(PROCESS_TERMINATE,false,pid);
result=TerminateProcess(hprocess,0);
CloseHandle(hprocess);
return result;
}
BOOL   CALLBACK  EnumWindowsProcGetWndTitle(HWND hWnd,LPARAM lParam)
{
DWORD ProcID = 0;
GetWindowThreadProcessId(hWnd,&ProcID);
if(ProcID==lParam)//如果窗口的processid等于你的ID
{
HWND pWnd = GetParent(hWnd);
while(GetParent(pWnd)!=NULL)//得到父窗口的句柄
{
pWnd = GetParent(pWnd);
g_hWnd = pWnd;
return FALSE;
}
//ok  pWnd 就是主窗口了。
}
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{


TCHAR path[200]= L"\\softkeyboard\\SoftBoard.exe";


// 打开进程
InitCreateProcess(path);


RECT rt;
GetWindowRect(g_hWnd,&rt);


TCHAR szPathName[100] = {0};
GetWindowText(g_hWnd,szPathName,sizeof(szPathName));


// 隐藏窗口
ShowWindow(g_hWnd,SW_HIDE);
// 显示窗口
ShowWindow(g_hWnd,SW_SHOW);
// 将窗口移动到0,0位置,大小改变为0,0,达到隐藏效果
MoveWindow(g_hWnd, 0, 0,0,0, TRUE); 
// 将窗口移动到0,0位置,窗口大小不变
MoveWindow(g_hWnd, 0, 0,rt.right-rt.left, rt.bottom-rt.top, TRUE);


CloseProcess(g_dwProcessId);
return 0;
}
0 0