现在要在我的程序里启动一个外部程序,启动外部程序时,它的窗口会出现,我用::FindWindow找到它的句柄再用::ShowWindow
(hwnd,SW_HIDE)隐藏它(这个过程写在OnTimer中),启动了外部程序后我还要对它进行一系列的操作,所以它又会弹出其它的窗
口,如果每次都用FindWindow,ShowWindow的话,窗口还是会出现一瞬间,然后再被隐藏,而且还会经常出现Findwindow失败的情况(可能是因为写在OnTimer中的原因),但如果不写在OnTimer中就只能用Sleep来等待窗口出现,这样很难判断sleep多久,而且每台机器都不同,不可能这样做。不知道还有什么办法能把外部程序完全在后台运行?我听过好像可以用HOOK,什么DLL注入,这个小弟实在不太懂,各位高手们帮个忙吧,最好有例子,谢谢谢谢谢谢

解决方案 »

  1.   

    Hook那个窗口的ShowWindow api函数.
      

  2.   

    STARTUPINFOA si;
    PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    memset(&pi, 0, sizeof(pi)); if( !CreateProcessA( NULL,
    (LPSTR)cmdline.c_str(),
    NULL,
    NULL,
    FALSE,
    CREATE_NO_WINDOW,// <<<<<<<-----此参数是否可以完成你要的功能
    NULL,
    workpath.empty() ? NULL : workpath.c_str(),
    &si,
    &pi)

    {
    return false;
    }
    if(exitcode)
    {
    // wait for process exit
    WaitForSingleObject(pi.hProcess, INFINITE);
    GetExitCodeProcess(pi.hProcess, exitcode);
    }
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
      

  3.   

    先谢谢两位,用CreateProcess函数启动外部程序是不能隐藏窗口的,甚至用ShellExecute(...,SW_HIDE)都不行,我试过了,因为它启动的exe并不是它的主窗口,它的主窗口可以在SPY++里找到(通常类名为#32770)1楼的能说详细点吗?我初学者,不懂得怎么HOOK,你知道的话就给我个例子吧!谢谢
      

  4.   

    1、首先用CreateDesktop创建一个桌面2、CreateProcess的倒数第二个参数是一个指向STARTUPINFO结构的指针,这个结构体中的lpDesktop成员可以设置成新桌面(创建的桌面名称),创建的进程将在这个桌面显示,而不是在当前桌面显示,这样就实现了窗口隐藏的效果3、如果你的进程需要退出,请确保首先退出创建的进程,然后用CloseDesktop关闭创建的桌面
      

  5.   

    同上。补充一点,可以创建一个新的线程,用SetThreadDesktop将线程设置到新的桌面下去控制目标进程。