读书人

ccrun呢?如何能用程序A启动程序B然

发布时间: 2012-02-22 19:36:55 作者: rapoo

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);

}

读书人网 >C++ Builder

热点推荐