小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VC 從一個(gè)程序中啟動(dòng)和關(guān)閉另一個(gè)程序

 杰杰梅梅一生一世 2012-11-19

今天正在編寫的程序是一個(gè)插件(PlugIn)。插件其實(shí)就是一個(gè)動(dòng)態(tài)鏈接庫,可以被主程序裝入內(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);
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多