• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            brent's hut

            simulate OnIdle in MFC ActiveX control

            There are two ways to do this, one is simple, another is complicated but more powerful.

            Method A:
            ::SetWindowsHookEx(WH_FOREGROUNDIDLE, YourIdleProc, AfxGetInstanceHandle(), GetCurrentThreadId());

            Method B (my way):
             1 static HHOOK s_hGetMsgHook = NULL;
             2 
             3 LRESULT FAR PASCAL GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
             4 {
             5     AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
             6 
             7     LPMSG lpMsg = (LPMSG) lParam;
             8     if( (nCode >= 0&& PM_REMOVE == wParam)
             9     {
            10         //your code here. maybe to deal with hot-keys, accelerators ...
            11         //see http://support.microsoft.com/kb/187988
            12 
            13         //my code to simulate OnIdle
            14         static BOOL bIdle = FALSE;
            15         CWinApp* pApp = AfxGetApp();
            16         if(!bIdle && pApp->IsIdleMessage(lpMsg))
            17             bIdle = TRUE;
            18         
            19         if(bIdle)
            20         {
            21             MSG msgPeek = {0};
            22             if(!::PeekMessage(&msgPeek, NULL, NULL, NULL, PM_NOREMOVE))
            23             {
            24                 VERIFY(PostMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_USER+0x120x340x56));
            25             }
            26         }
            27 
            28         if(lpMsg->hwnd == AfxGetMainWnd()->GetSafeHwnd() &&
            29             lpMsg->message == WM_USER+0x12 && lpMsg->wParam == 0x34 && lpMsg->lParam == 0x56)
            30         {
            31             lpMsg->message = WM_NULL;
            32             lpMsg->lParam = 0L;
            33             lpMsg->wParam = 0L;
            34 
            35             pApp->OnIdle(0);
            36             bIdle = FALSE;
            37         }
            38     }
            39 
            40     return ::CallNextHookEx(s_hGetMsgHook, nCode, wParam, lParam);
            41 }
            42 
            43 int CYourOleControl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
            44 {
            45     //...
            46     
            47     if(NULL == s_hGetMsgHook)
            48         s_hGetMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, AfxGetInstanceHandle(), GetCurrentThreadId());
            49 }
            50 
            51 void CYourOleControl::OnDestroy() 
            52 {
            53     //...
            54     
            55     ::UnhookWindowsHookEx(s_hGetMsgHook);
            56     s_hGetMsgHook = NULL;
            57 
            58     COleControl::OnDestroy();
            59 }

            Method A is far more simple, but with Method B:

            1) You can override CWinApp::IsIdleMessage to filter some special messages, such as a frequent timer which will not affect what you want to do in CWinApp::OnIdle. Because timer will affect message queue and if you don't filter it, OnIdle will be called every time after the timer is invoked.

            2) Sometimes your action in OnIdle will affect message queue inevitably, thus you will get a infinite loop: OnIdle->the special messages in message queue->OnIdle->... But with Method B, with SPY++ you can find the special messages, and filter them in IsIdleMessage.

            posted on 2010-04-15 15:49 brent 閱讀(1703) 評論(0)  編輯 收藏 引用 所屬分類: C++WindowsWeb

            国产精品久久网| 青青热久久国产久精品| 精品久久久久久久无码 | 久久青草国产手机看片福利盒子| 久久久噜噜噜久久| 中文字幕无码久久人妻| 18岁日韩内射颜射午夜久久成人| 91精品国产综合久久四虎久久无码一级 | 四虎国产精品免费久久久| 中文字幕久久精品 | 久久福利资源国产精品999| 久久精品天天中文字幕人妻| 久久久久一本毛久久久| 97超级碰碰碰久久久久| 久久精品水蜜桃av综合天堂| 久久午夜伦鲁片免费无码| 99久久99久久| 久久这里只有精品久久| 欧美久久综合性欧美| 热re99久久精品国99热| 91精品国产高清久久久久久国产嫩草| 无码专区久久综合久中文字幕| 狠狠色狠狠色综合久久| 久久国产成人精品麻豆| 国产福利电影一区二区三区久久老子无码午夜伦不 | 香蕉久久夜色精品国产小说| 热久久视久久精品18| 国产精品狼人久久久久影院 | 国产精自产拍久久久久久蜜| 久久99精品国产| 国产精品一久久香蕉产线看| 亚洲AV无码成人网站久久精品大| 伊人 久久 精品| 中文字幕乱码久久午夜| 一本一本久久a久久综合精品蜜桃| 亚洲精品成人网久久久久久| 久久99热这里只频精品6| 2019久久久高清456| 亚洲综合日韩久久成人AV| 亚洲中文久久精品无码| 久久国产精品成人片免费|