创建进程后得到该进程的主窗口句柄

来源:互联网 发布:centos安装ant 编辑:程序博客网 时间:2024/04/30 16:04

转载自 : http://blog.csdn.net/starlee/article/details/4861174

HWND CreateMyProcess()
{
// 进程启动信息
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;

// 进程信息
PROCESS_INFORMATION pi;

// 创建进程
// 第二个参数是要启动的应用程序路径名,比如:C:/Test.exe
if (CreateProcess(NULL, "应用程序路径名", NULL, NULL, false, 0, NULL, NULL, &si, &pi))
{
ProcessWindow procwin;
procwin.dwProcessId = pi.dwProcessId;
procwin.hwndWindow = NULL;

// 等待新进程初始化完毕
WaitForInputIdle(pi.hProcess, 5000);

// 查找主窗口
EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);
return procwin.hwndWindow
}
}

上面代码中用到了一个自定义的结构ProcessWindow。该结构只含有两个成员,当做参数来传入进程ID和传出主窗口句柄。

struct ProcessWindow
{
DWORD dwProcessId;
HWND hwndWindow;
};

其实,查找指定进程的主窗口的功能是由下面这个回调函数来实现的。

// 查找进程主窗口的回调函数
BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)
{
ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);

// 判断是否是指定进程的主窗口
if (pProcessWindow->dwProcessId == dwProcessId && IsWindowVisible(hWnd) && GetParent(hWnd) == NULL)
{
pProcessWindow->hwndWindow = hWnd;
return FALSE;
}
return TRUE;
}

看网上还有一种方法,还没有研究源代码,源代码如下所示:

// processenum.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#include <Psapi.h>
#include <string.h>
#pragma comment ( lib, "Psapi.lib" )

HWND lmshwnd;

BOOL CALLBACK EnumWindowsProc(HWND hwnd,DWORD lParam)
{
 DWORD mpid;
 GetWindowThreadProcessId(hwnd,&mpid);

 if (mpid==lParam)
 {
  int i=GetWindowTextLength(hwnd);
  char szhello[255]; 
  char lmschar[255]=_T("名称");
  GetWindowText(hwnd,szhello,i+1);
  if (strstr(szhello,lmschar))
  {
   printf("%s\n",szhello);
   lmshwnd=hwnd;
  }
 }
 return TRUE;
}

void PrintProcessNameAndID( DWORD processID )
{
 TCHAR szProcessName[MAX_PATH] = TEXT("unknow");
 //根据进程ID,打开进程返回进程的句柄
 HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,processID );
 //得到进程名
 if (NULL!=hProcess )
 {
  HMODULE hMod;
  DWORD cbNeeded;
  //EnumProcessModules根据句柄获取实例,保存到hMod中
  if (EnumProcessModules( hProcess,&hMod,sizeof(hMod),&cbNeeded) )
  {
   //获取根据进程句柄获取进程名称 szProcessName
   GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName)/sizeof(TCHAR) );
  }
 }
 //打印进程名和进程ID,其进程句柄为hProcess
 TCHAR *lmsname=TEXT("LMSVirtualLab.EXE");
 if (!strcmp(szProcessName,lmsname))
 {
  _tprintf( TEXT("%s  (PID: %x)\n"),szProcessName,processID);
  EnumWindows((WNDENUMPROC)EnumWindowsProc,processID);
  //HDESK hDesk=OpenDesktop(_T(""),0,FALSE,DESKTOP_ENUMERATE);  
  //EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowsProc,processID);
 }

 CloseHandle( hProcess );
}

int _tmain(int argc, _TCHAR* argv[])
{
 // 得到进程ID的列表
 DWORD aProcesses[1024], cbNeeded, cProcesses;
 unsigned int i;
 //列举所有进程的ID,返回到aProcesses数组中
 if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
  return 0;
 //计算一共返回了多少个进程ID
 cProcesses = cbNeeded / sizeof(DWORD);
 //打印每个进程的名称和对应的ID
 for ( i = 0; i < cProcesses; i++ )
 {
  if( aProcesses[i] != 0 )
  {
   PrintProcessNameAndID(aProcesses[i]);
  }
 }
 printf("%x\n",lmshwnd);
 ShowWindow(lmshwnd,SW_MAXIMIZE);
 return 0;
}






0 0
原创粉丝点击