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

            青青草国产精品久久| 欧美国产成人久久精品| 香蕉aa三级久久毛片| 久久伊人五月丁香狠狠色| 久久久久无码精品国产| 成人精品一区二区久久| 日本加勒比久久精品| 国产精品久久久久久久久久影院| 国产精品99久久久久久宅男小说 | 精品熟女少妇AV免费久久| 久久亚洲春色中文字幕久久久| 国产99久久久久久免费看| 人妻系列无码专区久久五月天| 日日狠狠久久偷偷色综合0| 久久精品国产亚洲AV忘忧草18| 成人国内精品久久久久一区| 久久91精品国产91| 91秦先生久久久久久久| 狠狠色婷婷综合天天久久丁香| 久久久亚洲AV波多野结衣| 2020最新久久久视精品爱| 久久综合给合久久国产免费| 亚洲欧洲中文日韩久久AV乱码| 久久av高潮av无码av喷吹| A级毛片无码久久精品免费| 少妇高潮惨叫久久久久久| 精品国产乱码久久久久久人妻 | 污污内射久久一区二区欧美日韩 | 精品午夜久久福利大片| 99久久精品免费看国产一区二区三区| 精品国产婷婷久久久| 久久狠狠高潮亚洲精品| 国产成年无码久久久免费| 久久午夜综合久久| 久久精品国产福利国产琪琪| 国产精品青草久久久久福利99| 亚洲中文久久精品无码ww16| 欧美精品国产综合久久| 亚洲Av无码国产情品久久| 午夜精品久久久久成人| 亚洲欧美国产日韩综合久久 |