ccrun呢?怎么能用程序A启动程序B,然后在程序A中控制程序B的窗口,有个例子,但不好使你们看看 - C++ Builder / Windows SDK/API
//---------------------------------------
#include <windows.h>
#pragma hdrstop
//---------------------------------------
#pragma argsused
static HWND s_hWnd = 0;
DWORD MYPID;//你的进程号
DWORD dwReavThreadId,dwSendThreadId;
DWORD dwProcessId;
DWORD dwResult;
STARTUPINFO lpStartupInfo;
PROCESS_INFORMATION lpProcessInfo;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD processID = 0;
GetWindowThreadProcessId(hwnd, &processID); // Windows api !!!!!
if (MYPID==processID )
{
s_hWnd = hwnd; // OK, found.
MessageBox(NULL, "t ", "d ",NULL);
return false;
}
}
HWND FindProcessWindow(DWORD processID)
{
s_hWnd = 0;
EnumWindows((int (__stdcall *)())EnumWindowsProc, processID);
return s_hWnd;
}
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ZeroMemory( &lpStartupInfo, sizeof(lpStartupInfo) );
lpStartupInfo.cb = sizeof(lpStartupInfo);
ZeroMemory( &lpProcessInfo, sizeof(lpProcessInfo) );
char he[255]= "regedit.exe ";
GetStartupInfo(&lpStartupInfo);
lpStartupInfo.cb = sizeof(lpStartupInfo);
lpStartupInfo.wShowWindow = SW_SHOW;
if(CreateProcess(NULL,he,NULL,NULL,FALSE,0,NULL,NULL,&lpStartupInfo,&lpProcessInfo)==0)
{
return -1;
}
MYPID=lpProcessInfo.dwProcessId;
FindProcessWindow(MYPID);
}
这段程序执行后得不到程序B的窗口句柄,希望大家帮忙看看
[解决办法]
1.你的程序不能被编译,改:
EnumWindows((int (__stdcall *)())EnumWindowsProc, processID);
为
EnumWindows((WNDENUMPROC)EnumWindowsProc, processID);
2.这个问题早碰过,因为CreateProcess是多线程执行的,在CreateProcess还没完成,你 FindProcessWindow(MYPID);不能得到B的窗口句柄,最简的方法,在FindProcessWindow(MYPID);前加:
Sleep(100);//数值与你的机器速度有关
[解决办法]
在找到的时候设置断点,然后看看找到的句柄的值是不是真的一样,可以用ccrun的工具先看看B的句柄
[解决办法]
你找到的不是主窗口,以下程序就可以了:
//---------------------------------------
#include <windows.h>
#pragma hdrstop
//---------------------------------------
#pragma argsused
static HWND s_hWnd = 0;
DWORD MYPID;//你的进程号
DWORD dwReavThreadId,dwSendThreadId;
DWORD dwProcessId;
DWORD dwResult;
STARTUPINFO lpStartupInfo;
PROCESS_INFORMATION lpProcessInfo;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD processID = 0;
HWND t;
GetWindowThreadProcessId(hwnd, &processID); // Windows api !!!!!
if (MYPID==processID )
{
t = s_hWnd =hwnd;
while (t = GetParent(s_hWnd))
s_hWnd=t;
MessageBox(NULL, "t ", "d ",NULL);
PostMessage(s_hWnd,WM_CLOSE ,0,0);
return false;
}
return true;
}
HWND FindProcessWindow(DWORD processID)
{
s_hWnd = 0;
EnumWindows((int (__stdcall *)(HWND__ *,long))EnumWindowsProc, processID);
return s_hWnd;
}
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ZeroMemory( &lpStartupInfo, sizeof(lpStartupInfo) );
lpStartupInfo.cb = sizeof(lpStartupInfo);
ZeroMemory( &lpProcessInfo, sizeof(lpProcessInfo) );
char he[255]= "regedit.exe ";
GetStartupInfo(&lpStartupInfo);
lpStartupInfo.cb = sizeof(lpStartupInfo);
lpStartupInfo.wShowWindow = SW_SHOW;
if(CreateProcess(NULL,he,NULL,NULL,FALSE,0,NULL,NULL,&lpStartupInfo,&lpProcessInfo)==0)
{
return -1;
}
MYPID=lpProcessInfo.dwProcessId;
Sleep(100);
FindProcessWindow(MYPID);
}