天天看點

從一個程式中啟動和關閉另一個程式

從一個程式中啟動和關閉另一個程式

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

從一個程式中啟動和關閉另一個程式

}