• <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

            精品国产青草久久久久福利 | 欧美精品福利视频一区二区三区久久久精品 | 婷婷久久综合| 久久久久久久精品妇女99| 99麻豆久久久国产精品免费| 91久久香蕉国产熟女线看| 色偷偷91久久综合噜噜噜噜| 久久精品欧美日韩精品| 国产午夜福利精品久久| 国色天香久久久久久久小说| 777久久精品一区二区三区无码| 国色天香久久久久久久小说| 国产精品免费看久久久香蕉| 久久精品国产第一区二区三区 | 国产精品九九久久精品女同亚洲欧美日韩综合区 | 99久久国产热无码精品免费| 久久综合精品国产一区二区三区| 国产99久久精品一区二区| 综合久久给合久久狠狠狠97色| 久久电影网2021| 久久综合国产乱子伦精品免费| 婷婷久久综合九色综合绿巨人| 国产女人aaa级久久久级| 国产亚洲精久久久久久无码| 久久精品国产男包| 精品久久久久中文字| 人人狠狠综合久久亚洲88| 国产成人久久精品区一区二区| 香蕉久久夜色精品升级完成| 久久婷婷五月综合97色直播| 亚洲伊人久久成综合人影院| 亚洲欧美一级久久精品| 欧美午夜A∨大片久久| 国产激情久久久久影院小草| 久久精品国产亚洲77777| 久久久一本精品99久久精品66| 亚洲欧美伊人久久综合一区二区| 亚洲精品无码专区久久久| 亚洲AV日韩精品久久久久久久| 久久久久亚洲AV无码专区体验| 精品久久久噜噜噜久久久|