• <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 閱讀(1699) 評論(0)  編輯 收藏 引用 所屬分類: C++WindowsWeb

            亚洲欧美久久久久9999| 精品国产青草久久久久福利 | 亚洲级αV无码毛片久久精品| 久久男人Av资源网站无码软件 | 成人国内精品久久久久一区| 久久青青草原亚洲av无码| 精品无码久久久久久午夜| 亚洲国产精品久久久久婷婷老年| 久久久亚洲AV波多野结衣| 久久WWW免费人成—看片| 久久婷婷五月综合色奶水99啪 | 久久久久久亚洲AV无码专区| 国产精品一区二区久久精品无码 | 亚洲成av人片不卡无码久久| 国产精品九九九久久九九| 国产A级毛片久久久精品毛片| 欧美性大战久久久久久| 精品国产一区二区三区久久久狼| 久久99国产精品成人欧美| 久久久精品人妻一区二区三区四| 亚洲国产成人久久综合野外| 久久久久综合网久久| 久久精品国产99国产精品澳门| 大伊人青草狠狠久久| 久久WWW免费人成一看片| 久久天天躁狠狠躁夜夜2020| 精品久久一区二区三区| 91久久精品91久久性色| 无码日韩人妻精品久久蜜桃| 日日狠狠久久偷偷色综合0| 国产精品综合久久第一页 | 久久久久国产| yy6080久久| 一级做a爰片久久毛片看看| 久久九九免费高清视频| 久久国产视屏| 伊色综合久久之综合久久| 91精品国产91久久综合| 久久久一本精品99久久精品66| 久久久久国产精品熟女影院| 久久综合综合久久97色|