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

            久久久久综合网久久| 久久久精品波多野结衣| 武侠古典久久婷婷狼人伊人| 99久久香蕉国产线看观香| 99久久免费国产精精品| 亚洲国产成人精品久久久国产成人一区二区三区综 | 91精品国产高清久久久久久国产嫩草 | 精品少妇人妻av无码久久| 精品久久久久久久久久中文字幕 | 伊人久久综合无码成人网| 久久国产精品免费一区二区三区| 久久午夜无码鲁丝片午夜精品| 一级做a爱片久久毛片| 亚洲午夜精品久久久久久app| 国产免费久久精品丫丫| 72种姿势欧美久久久久大黄蕉| 久久精品一区二区三区中文字幕| 亚洲va中文字幕无码久久不卡| 久久人人爽人人爽人人片av麻烦| 亚洲国产成人精品久久久国产成人一区二区三区综| 青青青青久久精品国产h久久精品五福影院1421 | 久久久久国产一区二区| 国产午夜福利精品久久2021| 99久久国产亚洲综合精品| 久久久久无码精品| 狠狠色综合久久久久尤物| 99久久精品国产高清一区二区 | 久久天天躁狠狠躁夜夜avapp| 一本色道久久综合亚洲精品| 久久精品成人欧美大片 | 亚洲人AV永久一区二区三区久久 | 久久久久亚洲AV成人网人人网站| 国产V亚洲V天堂无码久久久| 久久夜色精品国产噜噜亚洲AV| 国产精品中文久久久久久久| 久久综合日本熟妇| 三级韩国一区久久二区综合| 久久精品夜色噜噜亚洲A∨| 蜜桃麻豆www久久国产精品| 久久精品视屏| 久久久国产视频|