2010年2月1日 星期一

CuWaitKeyEven - 等待外部文字檔標示的EVENT

// CuWaitKeyEven.h



class CuWaitKeyEven  
{

    CuWinThread *m_pProcessThread;
public:
    wstring m_strSys;

    HANDLE  *_pHandleArray;

    wstring *_pStrEven;

    int _nNumEvent;

    // 程式設定檔

    CuWaitKeyEven();
    virtual ~CuWaitKeyEven();

    void Init();
    static DWORD Process(LPVOID lpVoid);
};


// CuWaitKeyEven.cpp


CuWaitKeyEven::CuWaitKeyEven()
:m_strSys(L"HardKey_sys.cfg")
,_pHandleArray(NULL)
,_nNumEvent(0)
,_pStrEven(NULL)
,m_pProcessThread(NULL)

{

}

CuWaitKeyEven::~CuWaitKeyEven()
{

    if( m_pProcessThread )
    {
        m_pProcessThread->Delete();
    }

    if( _pHandleArray )
    {
        for( int i = 0 ; i < _nNumEvent ; i++ )
        {
            CloseHandle(_pHandleArray[i]);
        }
        delete [] _pHandleArray;
    }

    if( _pStrEven )
        delete [] _pStrEven;


}

DWORD CuWaitKeyEven::Process(LPVOID lpVoid)
{

    CuWaitKeyEven *pWaitKeyEven = (CuWaitKeyEven *)lpVoid;
 
    DWORD dwResult;
    int nIndex;
    while (1)
    {
        dwResult = WaitForMultipleObjects(pWaitKeyEven->_nNumEvent, pWaitKeyEven->_pHandleArray, FALSE, INFINITE);

        keybd_event(VK_F12, 0, 0 ,0);
        keybd_event(VK_F12, 0, KEYEVENTF_KEYUP,0);


        nIndex = dwResult - WAIT_OBJECT_0;

        ResetEvent(pWaitKeyEven->_pHandleArray[nIndex]);

        PostMessage(GetTheApp()->m_hWnd, WM_HR_PROCESS, (WPARAM)(void*)pWaitKeyEven->_pStrEven[nIndex].c_str(), (LPARAM)pWaitKeyEven);

    }

    return 0;
}



void CuWaitKeyEven::Init()
{
    
    CuModuleFile mf;
    wstring strTempSysName = mf.GetModuleFileName(m_strSys.c_str());

    IuFileLex *pFileLex;
    pFileLex = new CuFileLex;
    
    pFileLex->Open(strTempSysName.c_str(), L"r");
    
    pFileLex->_readInt(_nNumEvent);
    
    if( _nNumEvent )
    {
        _pHandleArray = new HANDLE[_nNumEvent];
        _pStrEven = new wstring[_nNumEvent];
        
        wstring strEven;
        for( int i = 0 ; i < _nNumEvent ; i++ )
        {
            pFileLex->_readString(strEven);
            _pStrEven[i] = strEven;
            _pHandleArray[i] =  CreateEvent( NULL, TRUE, FALSE, strEven.c_str()) ;
        }
        
        
        m_pProcessThread = ::_BeginThread((_THREADPROC)CuWaitKeyEven::Process, (LPVOID)this);
    }
    pFileLex->Release();

}

1 則留言:

  1. 這個算是復合應用類別, 將前面的基礎類別結合, 就能用極少的碼完成特別的功能! -- 將收到的EVENT轉為WM Message 丟回 theApp Main windows.

    回覆刪除