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

            久久不见久久见免费视频7| 久久久久国产| 天天躁日日躁狠狠久久| 久久亚洲AV成人出白浆无码国产 | 99久久99久久精品免费看蜜桃| 久久免费视频1| 色欲久久久天天天综合网精品| 色欲综合久久中文字幕网| 韩国无遮挡三级久久| 久久国产成人精品国产成人亚洲| 久久夜色精品国产| 久久综合给合久久狠狠狠97色| 99久久精品免费看国产免费| 欧美一级久久久久久久大| 精品久久亚洲中文无码| 国产精品久久永久免费| 人人狠狠综合88综合久久| 久久亚洲精品人成综合网| 色综合合久久天天综合绕视看| 午夜视频久久久久一区| 久久久久国产精品熟女影院| 国产午夜精品理论片久久| 97精品依人久久久大香线蕉97 | 国产精品女同久久久久电影院| 99久久亚洲综合精品网站| 人人妻久久人人澡人人爽人人精品| 久久婷婷五月综合97色一本一本| 色婷婷狠狠久久综合五月| 久久久无码精品亚洲日韩蜜臀浪潮| 91久久九九无码成人网站| 久久香蕉超碰97国产精品| 亚洲国产视频久久| 久久久久女教师免费一区| aaa级精品久久久国产片| 亚洲AV日韩AV永久无码久久| 无码精品久久一区二区三区| 国产精品久久久久久久| 久久久久久国产精品免费无码| 亚洲欧美日韩中文久久| 久久精品国产亚洲AV不卡| 日韩中文久久|