首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

ccrun呢?如何能用程序A启动程序B,然后在程序A中控制程序B的窗口,有个例子,但不好使你们看看

2012-02-22 
ccrun呢?怎么能用程序A启动程序B,然后在程序A中控制程序B的窗口,有个例子,但不好使你们看看 - C++ Builder

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

}

热点排行