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