<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 117  文章 - 72  trackbacks - 0

    聲明:原創(chuàng)作品(標(biāo)有[原]字樣)轉(zhuǎn)載時(shí)請注明出處,謝謝。

    常用鏈接

    常用設(shè)置
    常用軟件
    常用命令
     

    訂閱

    訂閱

    留言簿(7)

    隨筆分類(130)

    隨筆檔案(123)

    搜索

    •  

    積分與排名

    • 積分 - 155669
    • 排名 - 391

    最新評論

    [標(biāo)題]:在全局鼠標(biāo)鉤子中模擬鼠標(biāo)右鍵單擊
    [時(shí)間]:2009-3-28
    [摘要]:本文分為兩部分,第一部分:使用SwapMouseButton()切換鼠標(biāo)左右鍵功能。第二部分:在全局鼠標(biāo)鉤子中模擬鼠標(biāo)右鍵單擊。
    [關(guān)鍵字]:鼠標(biāo)失靈,鼠標(biāo)右鍵,切換鼠標(biāo)左右鍵,屏幕寬度,屏幕高度,SendInput,全局鼠標(biāo)鉤子,鼠標(biāo)事件
    [平臺(tái)]:Windows XP SP3 ,VC6
    [作者]:Winty (wintys@gmail.com)

    [正文]:
        我的鼠標(biāo)左鍵失靈了。暫時(shí)只能使用鼠標(biāo)右鍵。就只能把鼠標(biāo)右鍵改成左鍵用(切換方法:控制面板->鼠標(biāo)->切換主要和次要的按鍵)。當(dāng)然,切換了之后,右鍵功能就沒有了。可是平時(shí)用慣了鼠標(biāo)右鍵,現(xiàn)在沒有可不行。利用程序切換時(shí),代碼片段如下:

    //bSwap:BOOL型
    //為TRUE為切換左右鍵功能,為FALSE為恢復(fù)原左右鍵功能
    ::SwapMouseButton(bSwap);

        可以使用RegisterHotKey()注冊一個(gè)熱鍵,在需要時(shí)切換。但是還得知道該傳入TRUE還是FALSE到SwapMouseButton(),那么可以使用GetSystemMetrics(SM_SWAPBUTTON)查詢鼠標(biāo)當(dāng)前左右鍵功能是否反轉(zhuǎn)了:

    //返回TRUE表示鼠標(biāo)左右鍵功能反轉(zhuǎn)了,F(xiàn)ALSE表示正常
    ::GetSystemMetrics(SM_SWAPBUTTON);

        最后可以讓程序每次自動(dòng)啟動(dòng),需要右鍵的時(shí)候按一下熱鍵就可以了,使用完了再切換回來。問題是,這樣每次使用時(shí),在左右鍵之間來回切換很麻煩。
       
        下面在全局鼠標(biāo)鉤子中模擬鼠標(biāo)右鍵單擊。當(dāng)按Ctrl+鼠標(biāo)左鍵時(shí),相當(dāng)于點(diǎn)擊右鍵。這里所說的鼠標(biāo)左鍵與右鍵都是用SwapMouseButton(TRUE)切換過的,也就是說,我的真實(shí)的鼠標(biāo)左鍵已壞,實(shí)際上只有鼠標(biāo)右鍵可以使用,現(xiàn)在我把鼠標(biāo)右鍵當(dāng)左鍵用,但又添加右鍵本身的功能(就是加按Ctrl時(shí)相當(dāng)于原來的右鍵)。未特殊說明,則下同。

        1、使用SetWindowsHookEx安裝鉤子。
    HHOOK CUtil::InstallMouseHook(HINSTANCE hInstance)
    {
        HHOOK hhkMouseHook;
        hhkMouseHook = SetWindowsHookEx(
            WH_MOUSE_LL,                        // hook type
            CUtil::LowLevelMouseProc,        // hook procedure
            hInstance,                                    // handle to application instance
            0                                                // thread identifier:為0表示全局鉤子
        );

        if(hhkMouseHook==NULL)
            MessageBox(NULL,"安裝MouseHook失敗!","InstallMouseHook()",MB_OK);

        return hhkMouseHook;
    }

       
        在應(yīng)用程序的InitInstance()中調(diào)用:
    //m_hInstance為應(yīng)用程序?qū)嵗浔?br /> HHOOK hhkLowLevelKybd = InstallMouseHook(m_hInstance):

        2、編寫全局鼠標(biāo)鉤子回調(diào)函數(shù)LowLevelMouseProc:
    //當(dāng)按下"Ctrl+鼠標(biāo)左鍵" 或 "數(shù)字鍵盤減號鍵 + 鼠標(biāo)左鍵"時(shí),模擬鼠標(biāo)右鍵
    LRESULT CALLBACK
    CUtil::LowLevelMouseProc(int nCode,
                                            WPARAM wParam,
                                            LPARAM lParam)
    {
        if(nCode == HC_ACTION){
            //左Ctrl鍵按下
            BOOL bLeftCtrlDown =
                (GetAsyncKeyState(VK_LCONTROL) & 0x8000) != 0;
            //數(shù)字鍵盤減號"-"鍵按下
            BOOL bNumpadSubtractDown = 
                (GetAsyncKeyState(VK_SUBTRACT) & 0x8000) != 0;

            //當(dāng)按下"Ctrl+鼠標(biāo)左鍵" 或 "數(shù)字鍵盤減號鍵+鼠標(biāo)左鍵"時(shí),模擬鼠標(biāo)右鍵
            if( (wParam == WM_LBUTTONDOWN) &&
                (bLeftCtrlDown || bNumpadSubtractDown) )   
            {
                const INPUT_SIZE = 2;
                INPUT input[INPUT_SIZE];
                ZeroMemory( &input, sizeof(INPUT)*INPUT_SIZE);//初始化INPUT結(jié)構(gòu)體
               
                //鼠標(biāo)右鍵按下
                input[0].type = INPUT_MOUSE;
                input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
                   
                //鼠標(biāo)右鍵彈起
                input[1].type = INPUT_MOUSE;
                input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;

                //發(fā)送鼠標(biāo)右鍵單擊
                SendInput(
                    INPUT_SIZE,                // count of input events
                    input,                    // array of input events
                    sizeof(INPUT)            // size of structure
                );
               
                //發(fā)送模擬的鼠標(biāo)右鍵單擊后,不再響應(yīng)鼠標(biāo)左鍵單擊消息
                return 1;   
            }

        }
       
        //如果不是"Ctrl+鼠標(biāo)左鍵"按下,則向后傳遞鼠標(biāo)消息。
        return CallNextHookEx(NULL,nCode,wParam,lParam);
    }

        LowLevelMouseProc()有幾點(diǎn)要注意的地方:
            a)、LowLevelMouseProc()應(yīng)聲明為static,因?yàn)樵谝粋€(gè)類中,只有static函數(shù)才能作為回調(diào)函數(shù)。
            b)、wParam == WM_LBUTTONDOWN一句原來寫的是WM_LBUTTONUP,結(jié)果點(diǎn)擊后右鍵菜單出來了,但無法完成復(fù)制。所以應(yīng)為WM_LBUTTONDOWN就不會(huì)有問題了。
            c)、只用使用VK_LCONTROL而不是VK_CONTROL是因?yàn)镃trl+鼠標(biāo)左鍵單擊在選擇多個(gè)文件時(shí)已被使用。所以把VK_RCONTROL留給選擇多個(gè)文件等其它用途時(shí)使用,而用數(shù)字鍵盤中的減號代替VK_RCONTROL。也就是說,當(dāng)按下"Ctrl+鼠標(biāo)左鍵" 或 "數(shù)字鍵盤減號鍵+鼠標(biāo)左鍵"時(shí),模擬鼠標(biāo)右鍵。
            d)、input[i].mi.dwFlags中不用MOUSEEVENTF_ABSOLUTE,代表input[i].mi.dx或input[i].mi.dx中的坐標(biāo)是相對于上一次鼠標(biāo)事件時(shí)的坐標(biāo),而dx和dy都已被初始化為0,即在原地顯示鼠標(biāo)右鍵菜單;
            e)、也可以在input[i].mi.dwFlags中使用MOUSEEVENTF_ABSOLUTE,此時(shí)是絕對坐標(biāo),input[i].mi.dx和input[i].mi.dx的計(jì)算如下(而不是直接使用當(dāng)前鼠標(biāo)位置,具體原因請查看MSDN):

    PMSLLHOOKSTRUCT pllh = (PMSLLHOOKSTRUCT)lParam;//鼠標(biāo)坐標(biāo)等信息

    int cx=GetSystemMetrics(SM_CXSCREEN);//得到屏幕寬度
    int cy=GetSystemMetrics(SM_CYSCREEN);//得到屏幕高度

    LONG dx = pllh->pt.x * 65535 / cx;
    LONG dy = pllh->pt.y * 65535 / cy;

    input[0].mi.dx = dx;
    input[0].mi.dy = dy;

    input[1].mi.dx = dx;
    input[1].mi.dy = dy;

            f)、在發(fā)送完模擬的鼠標(biāo)右鍵事件后,需要return 1;來阻止消息的繼續(xù)傳遞,而不是return CallNextHookEx(NULL,nCode,wParam,lParam);,不然會(huì)出現(xiàn)不正確的右鍵行為。
            g)、需要發(fā)送鼠標(biāo)右鍵按下和彈起兩個(gè)事件,不然會(huì)出現(xiàn)不正確的右鍵行為。
            h)、WM_LBUTTONDOWN映射的是邏輯鼠標(biāo)按鍵,wParam == WM_LBUTTONDOWN表示鼠標(biāo)左鍵按下。而MOUSEEVENTF_LEFTDOWN映射的是物理鼠標(biāo)按鍵,input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN對應(yīng)已切換功能的真實(shí)鼠標(biāo)左鍵,所以實(shí)際表示發(fā)送的是鼠標(biāo)右鍵消息。MOUSEEVENTF_LEFTUP意義相仿。

        3、在應(yīng)用程序的ExitInstance()中卸載全局鼠標(biāo)鉤子:
    UnhookWindowsHookEx(hhkMouseHook);

        這樣就完成了所需要的功能。當(dāng)按下"Ctrl+鼠標(biāo)左鍵" 或 "數(shù)字鍵盤減號鍵 + 鼠標(biāo)左鍵"時(shí),相當(dāng)于按了右鍵。
    posted on 2009-03-28 15:55 天堂露珠 閱讀(2297) 評論(0)  編輯  收藏 所屬分類: C++
    主站蜘蛛池模板: 国产国拍亚洲精品福利| 国产高清免费观看| 亚洲av午夜福利精品一区| 在线播放免费人成视频网站| 免费日韩在线视频| 青青青亚洲精品国产| 免费人成在线观看网站视频 | 亚洲蜜芽在线精品一区| 19禁啪啪无遮挡免费网站| 亚洲欧洲日产国码在线观看| 中国在线观看免费高清完整版 | 亚洲高清在线播放| 99精品视频免费观看| 亚洲男人的天堂在线| 无码国产精品一区二区免费I6| 中国china体内裑精亚洲日本| 免费毛片在线播放| 日韩大片在线永久免费观看网站 | 99人中文字幕亚洲区| 一个人免费观看在线视频www| 亚洲熟女www一区二区三区| 免费永久看黄在线观看app| 热久久这里是精品6免费观看| 亚洲a在线视频视频| 成人影片麻豆国产影片免费观看 | 在线免费一区二区| 九九免费精品视频在这里| 亚洲av一综合av一区| 免费电影在线观看网站| 免费的黄网站男人的天堂| 国产成人精品日本亚洲网站| 51精品视频免费国产专区| 亚洲AV无码国产精品永久一区| 久久青青草原亚洲av无码| 0588影视手机免费看片| 特级毛片在线大全免费播放| 亚洲国产人成网站在线电影动漫| 午夜老司机免费视频| 国产成人AV免费观看| 亚洲色大成网站www永久网站| 亚洲一区无码精品色|