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