请问:
1、怎样将另一个进程(无源码)的界面嵌入到我的进程中的某个位置?
2、当我的进程窗口位置、大小改变时,该进程的窗口也要随之改变。采用在进程中接入dll,对该进程的主窗口进行子类化的方法可行吗,如果用这种方法,该进程的主窗口怎样才能知道我的进程窗口位置、大小的变化?

解决方案 »

  1.   

    你可以获得对应进程句柄等,然后自己MoveWindow等来控制他位置,大小....
      

  2.   

    1. SetParent劫持窗口
    2. Subclassing处理WM_SIZE
    姑且试试
      

  3.   

    方法倒是有很多,不过最好用你最适合的,例如上面说到的子类化,当然,也可以用钩子来实现,
    我比较喜欢用这个方法,这样你方说,你可以写一个 DLL ,把你的窗口都放在里面,然后用消息钩子或远程注入的方法注入到他的进程里面,你这样控制起来会比子类化等窗口控制方法灵活的多。
    至于用具体的代码你可以参考 Windows核心编程的动态链接库一章,当然在网上搜也能搜到一大把
      

  4.   

    按照驱动:
    #include <windows.h>
    #define PRIVATE    static
    /****************************************************************************
    *
    *    FUNCTION: InstallDriver( IN SC_HANDLE, IN LPCTSTR, IN LPCTSTR)
    *
    *    PURPOSE: Creates a driver service.
    *
    ****************************************************************************/
     PRIVATE BOOL InstallDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName, IN LPCTSTR ServiceExe )
    {
        SC_HANDLE  schService;    //
        // NOTE: This creates an entry for a standalone driver. If this
        //       is modified for use with a driver that requires a Tag,
        //       Group, and/or Dependencies, it may be necessary to
        //       query the registry for existing driver information
        //       (in order to determine a unique Tag, etc.).
        //    schService = CreateService( SchSCManager,          // SCManager database
                                    DriverName,           // name of service
                                    DriverName,           // name to display
                                    SERVICE_ALL_ACCESS,    // desired access
                                    SERVICE_KERNEL_DRIVER, // service type
                                    SERVICE_DEMAND_START,  // start type
                                    SERVICE_ERROR_NORMAL,  // error control type
                                    ServiceExe,            // service's binary
                                    NULL,                  // no load ordering group
                                    NULL,                  // no tag identifier
                                    NULL,                  // no dependencies
                                    NULL,                  // LocalSystem account
                                    NULL                   // no password
                                    );
        if ( schService == NULL )
            return FALSE;    CloseServiceHandle( schService );    return TRUE;
    }
    /****************************************************************************
    *
    *    FUNCTION: StartDriver( IN SC_HANDLE, IN LPCTSTR)
    *
    *    PURPOSE: Starts the driver service.
    *
    ****************************************************************************/
    PRIVATE BOOL StartDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName )
    {
        SC_HANDLE  schService;
        BOOL       ret;    schService = OpenService( SchSCManager,
                                  DriverName,
                                  SERVICE_ALL_ACCESS
                                  );
        if ( schService == NULL )
            return FALSE;    ret = StartService( schService, 0, NULL )
           || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING;    CloseServiceHandle( schService );
        return ret;
    }/****************************************************************************
    *
    *    FUNCTION: OpenDevice( IN LPCTSTR, HANDLE *)
    *
    *    PURPOSE: Opens the device and returns a handle if desired.
    *
    ****************************************************************************/
    PRIVATE BOOL OpenDevice( IN LPCTSTR DriverName, HANDLE * lphDevice )
    {
        TCHAR    completeDeviceName[64];
        HANDLE   hDevice;    //
        // Create a \\.\XXX device name that CreateFile can use
        //
        // NOTE: We're making an assumption here that the driver
        //       has created a symbolic link using it's own name
        //       (i.e. if the driver has the name "XXX" we assume
        //       that it used IoCreateSymbolicLink to create a
        //       symbolic link "\DosDevices\XXX". Usually, there
        //       is this understanding between related apps/drivers.
        //
        //       An application might also peruse the DEVICEMAP
        //       section of the registry, or use the QueryDosDevice
        //       API to enumerate the existing symbolic links in the
        //       system.
        //    wsprintf( completeDeviceName, TEXT("\\\\.\\%s"), DriverName );    hDevice = CreateFile( completeDeviceName,
                              GENERIC_READ | GENERIC_WRITE,
                              0,
                              NULL,
                              OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL,
                              NULL
                              );
        if ( hDevice == ((HANDLE)-1) )
            return FALSE; // If user wants handle, give it to them.  Otherwise, just close it.
    if ( lphDevice )
    *lphDevice = hDevice;
    else
        CloseHandle( hDevice );    return TRUE;
    }
    /****************************************************************************
    *
    *    FUNCTION: StopDriver( IN SC_HANDLE, IN LPCTSTR)
    *
    *    PURPOSE: Has the configuration manager stop the driver (unload it)
    *
    ****************************************************************************/
    PRIVATE BOOL StopDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName )
    {
        SC_HANDLE       schService;
        BOOL            ret;
        SERVICE_STATUS  serviceStatus;    schService = OpenService( SchSCManager, DriverName, SERVICE_ALL_ACCESS );
        if ( schService == NULL )
            return FALSE;    ret = ControlService( schService, SERVICE_CONTROL_STOP, &serviceStatus );    CloseServiceHandle( schService );    return ret;
    }/****************************************************************************
    *
    *    FUNCTION: RemoveDriver( IN SC_HANDLE, IN LPCTSTR)
    *
    *    PURPOSE: Deletes the driver service.
    *
    ****************************************************************************/
    PRIVATE BOOL RemoveDriver( IN SC_HANDLE SchSCManager, IN LPCTSTR DriverName )
    {
        SC_HANDLE  schService;
        BOOL       ret;    schService = OpenService( SchSCManager,
                                  DriverName,
                                  SERVICE_ALL_ACCESS
                                  );    if ( schService == NULL )
            return FALSE;    ret = DeleteService( schService );    CloseServiceHandle( schService );    return ret;
    }
    /****************************************************************************
    *
    *    FUNCTION: UnloadDeviceDriver( const TCHAR *)
    *
    *    PURPOSE: Stops the driver and has the configuration manager unload it.
    *
    ****************************************************************************/
    BOOL UnloadDeviceDriver( const TCHAR * Name )
    {
    SC_HANDLE schSCManager; schSCManager = OpenSCManager( NULL,                 // machine (NULL == local)
                                   NULL,                 // database (NULL == default)
    SC_MANAGER_ALL_ACCESS // access required
    );
    StopDriver( schSCManager, Name );
    RemoveDriver( schSCManager, Name ); 
    CloseServiceHandle( schSCManager ); return TRUE;
    }/****************************************************************************
    *
    *    FUNCTION: LoadDeviceDriver( const TCHAR, const TCHAR, HANDLE *)
    *
    *    PURPOSE: Registers a driver with the system configuration manager 
    *  and then loads it.
    *
    ****************************************************************************/
    BOOL LoadDeviceDriver( const TCHAR * Name, const TCHAR * Path, HANDLE * lphDevice )
    {
    SC_HANDLE schSCManager;
    BOOL okay; schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
    // Remove old instances
    RemoveDriver( schSCManager, Name ); // Ignore success of installation: it may already be installed.
    InstallDriver( schSCManager, Name, Path ); // Ignore success of start: it may already be started.
    StartDriver( schSCManager, Name ); // Do make sure we can open it.
    okay = OpenDevice( Name, lphDevice );  CloseServiceHandle( schSCManager ); return okay;
    }