今天正在編寫的程序是一個插件(PlugIn)。插件其實就是一個動態(tài)鏈接庫,可以被主程序裝入內(nèi)存中,并調(diào)用插件中按照主程序規(guī)定編寫的函數(shù)。由于插件受制于主程序,因此我必須另外提供一個程序可以擴展插件的功能。于是乎,我就編寫了一個更加復雜的程序來完成更多的功能,但是為了使這個程序可以看起來是和使用插件的程序象是集成在一起的,就必須在啟動插件程序的過程中,也同時啟動我后來編寫的程序,并且還要在插件主程序關閉之前,將我編寫的程序也關閉。為了實現(xiàn)這一目的,ShellExecuteEx()以及FindWindow()就被使用了。 ShellExecute()和ShellExecuteEx()被設計可以通過系統(tǒng)來啟動一個程序。為了可以正確執(zhí)行程序,那么就要為ShellExecute()和ShellExecuteEx()指定正確的目錄和程序名。
下面是一個使用ShellExecuteEx的例子:
SHELLEXECUTEINFO ShExecInfo; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = NULL; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = _T(“C:\\MyProgram.exe“); // 執(zhí)行的程序名 ShExecInfo.lpParameters = NULL; ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_MAXIMIZE; // 全屏顯示這個程序 ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
如果ShellExecuteEx()沒有執(zhí)行正確,GetLastError 會幫助你找到問題所在。如果ShellExecuteEx執(zhí)行正確,那么這個函數(shù)會返回TRUE.
要關閉一個程序,我們可以通過FindWindow()找到這個窗口,然后向窗口發(fā)送關閉消息,就可以了。問題就在于如何找到正確的窗口。
HWND FindWindow( LPCTSTR lpClassName, // class name LPCTSTR lpWindowName // window name );
FindWindow的兩個參數(shù)可以幫助你定位一個窗口。如果你確實知道一個窗口的窗口名稱,那么可以這樣用。 HWND hWnd = ::FindWindow(NULL, _T(“NotePad”)); if (NULL != hWnd) { ::SendMessage(hWnd, WM_CLOSE, 0, 0); }
如果窗口的標題是可變的,那么就要利用窗口的類名。類名可以通過使用Spy++得到。如果這個窗口是自己編寫的,就要注冊一個好記的窗口類名,在創(chuàng)建窗口之前,注冊這個窗口。
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); }
|