天天看点

从一个程序中启动和关闭另一个程序

从一个程序中启动和关闭另一个程序

ShellExecute()和ShellExecuteEx()被设计可以通过系统来启动一个程序。为了可以正确执行程序,那么就要为ShellExecute()和ShellExecuteEx()指定正确的目录和程序名。

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

下面是一个使用ShellExecuteEx的例子:

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

SHELLEXECUTEINFO  ShExecInfo;

从一个程序中启动和关闭另一个程序

ShExecInfo.cbSize  =   sizeof (SHELLEXECUTEINFO);

从一个程序中启动和关闭另一个程序

ShExecInfo.fMask      =  NULL;

从一个程序中启动和关闭另一个程序

ShExecInfo.hwnd       =  NULL;

从一个程序中启动和关闭另一个程序

ShExecInfo.lpVerb     =  NULL;

从一个程序中启动和关闭另一个程序

ShExecInfo.lpFile       =  _T(“C:/MyProgram.exe“);         //  执行的程序名

从一个程序中启动和关闭另一个程序

ShExecInfo.lpParameters  =  NULL;

从一个程序中启动和关闭另一个程序

ShExecInfo.lpDirectory      =  NULL;

从一个程序中启动和关闭另一个程序

ShExecInfo.nShow            =  SW_MAXIMIZE;                 //  全屏显示这个程序

从一个程序中启动和关闭另一个程序

ShExecInfo.hInstApp  =  NULL;

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

ShellExecuteEx( & ShExecInfo);

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

如果ShellExecuteEx()没有执行正确,GetLastError 会帮助你找到问题所在。如果ShellExecuteEx执行正确,那么这个函数会返回TRUE.

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

要关闭一个程序,我们可以通过FindWindow()找到这个窗口,然后向窗口发送关闭消息,就可以了。问题就在于如何找到正确的窗口。

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

HWND FindWindow(

从一个程序中启动和关闭另一个程序

  LPCTSTR lpClassName,   //  class name

从一个程序中启动和关闭另一个程序

  LPCTSTR lpWindowName   //  window name

从一个程序中启动和关闭另一个程序

);

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

FindWindow的两个参数可以帮助你定位一个窗口。如果你确实知道一个窗口的窗口名称,那么可以这样用。

从一个程序中启动和关闭另一个程序

HWND hWnd  =  ::FindWindow(NULL, _T(“NotePad”));

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

if  (NULL  !=  hWnd)  ... {

从一个程序中启动和关闭另一个程序

    ::SendMessage(hWnd, WM_CLOSE, 0, 0);

从一个程序中启动和关闭另一个程序

}

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

如果窗口的标题是可变的,那么就要利用窗口的类名。类名可以通过使用Spy ++ 得到。如果这个窗口是自己编写的,就要注册一个好记的窗口类名,在创建窗口之前,注册这个窗口。

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

BOOL CMyWnd::Create(DWORD dwStyle, CRect &  rect, CWnd *  pParent, UINT nID)

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

... {

从一个程序中启动和关闭另一个程序

    WNDCLASS wndcls;

从一个程序中启动和关闭另一个程序

    HINSTANCE hinst = AfxGetInstanceHandle();

从一个程序中启动和关闭另一个程序

    LPCTSTR lpszClassName = _T(“MyWindow“);

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

    if(!(::GetClassInfo(hinst, lpszClassName,&wndcls)))

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

    ...{

从一个程序中启动和关闭另一个程序

        //not yet,so register it

从一个程序中启动和关闭另一个程序

        wndcls.style         =  CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;

从一个程序中启动和关闭另一个程序

        wndcls.lpfnWndProc   =  ::DefWindowProc;

从一个程序中启动和关闭另一个程序

        wndcls.cbClsExtra    =  wndcls.cbWndExtra = 0;

从一个程序中启动和关闭另一个程序

        wndcls.hInstance     =  hinst;

从一个程序中启动和关闭另一个程序

        wndcls.hIcon         =  NULL;

从一个程序中启动和关闭另一个程序

        wndcls.hCursor       =  NULL;

从一个程序中启动和关闭另一个程序

        wndcls.lpszMenuName  =  NULL;

从一个程序中启动和关闭另一个程序

        wndcls.hbrBackground =  (HBRUSH)(COLOR_3DFACE + 1);

从一个程序中启动和关闭另一个程序

        wndcls.lpszClassName =  lpszClassName;

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

        if(!AfxRegisterClass(&wndcls)) ...{

从一个程序中启动和关闭另一个程序

            AfxThrowResourceException();

从一个程序中启动和关闭另一个程序

        }

从一个程序中启动和关闭另一个程序

    }

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

    return CWnd::Create(lpszClassName, NULL, dwStyle, rect, pParentWnd,NULL));

从一个程序中启动和关闭另一个程序

}

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

/

从一个程序中启动和关闭另一个程序

HWND hWnd  =  ::FindWindow(_T(“MyWindow“), NULL);

从一个程序中启动和关闭另一个程序
从一个程序中启动和关闭另一个程序

if  (NULL  !=  hWnd)  ... {

从一个程序中启动和关闭另一个程序

    ::SendMessage(hWnd, WM_CLOSE, 0, 0);

从一个程序中启动和关闭另一个程序

}