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

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            如何用全局Hook記錄鼠標滾輪的動作?

            Posted on 2010-01-13 21:34 S.l.e!ep.¢% 閱讀(2125) 評論(0)  編輯 收藏 引用 所屬分類: RootKit
            1 舊 2006-08-02, 18:12 默認【已解決】如何用全局Hook記錄鼠標滾輪的動作?
            masmprogra 當前離線 添加 masmprogra 的聲望 反映此帖

            我能記錄鼠標移動,左右鍵單雙擊等動作,只有滾輪滾動無法記錄,求教高手指點怎么捕獲此動作??

            此帖于 2006-08-03 16:05 被 masmprogra 最后編輯
            回復時引用此帖 多重引用本帖 快速回復此帖 返回頂端
            masmprogra
            級別:0 | 在線時長:1小時 | 升級還需:4小時

            初級會員
            初級會員

            資 料:
            注冊日期: Jun 2006
            帖子: 61masmprogra 品行端正
            精華: 0
            現金: 200 Kx
            2 舊 2006-08-03, 09:41 默認
            masmprogra 當前離線 添加 masmprogra 的聲望 反映此帖

            用來記錄鼠標鍵盤動作的鉤子:
            SetWindowsHookEx(WH_JOURNALRECORD,?(HOOKPROC)RecHookProc,?AfxGetApp()->m_hInstance,?0);

            用來播放鼠標鍵盤動作的鉤子:
            SetWindowsHookEx(WH_JOURNALPLAYBACK,?(HOOKPROC)PlayHookProc,?AfxGetApp()->m_hInstance,?0);


            因為單位里完全沒有測試人員導致修復軟件問題時,好了這邊壞了那邊?
            我就想寫個鉤子程序出來,記錄一次完整的黑盒測試過程,然后每次改動程序,都用此過程進行測試.

            現在就是無法記錄鼠標滾輪的事件,郁悶一天了????

            請高手指點指點

            此帖于 2006-08-03 10:01 被 masmprogra 最后編輯
            回復時引用此帖 多重引用本帖 快速回復此帖 返回頂端
            紅火蟻
            級別:1 | 在線時長:7小時 | 升級還需:5小時

            普通會員
            普通會員

            資 料:
            注冊日期: May 2006
            帖子: 62紅火蟻 品行端正
            精華: 3
            現金: 200 Kx
            3 舊 2006-08-03, 09:54 默認
            紅火蟻 當前離線 添加 紅火蟻 的聲望 反映此帖

            看看MSDN?
            LRESULT?CALLBACK?LowLevelMouseProc(
            ??int?nCode,?????//?hook?code
            ??WPARAM?wParam,?//?message?identifier
            ??LPARAM?lParam??//?pointer?to?structure?with?message?data
            );
            它下面有一句話
            wParam?
            Specifies?the?identifier?of?the?mouse?message.?This?parameter?can?be?one?of?the?following?messages:WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,WM_MOUSEWHEEL,WM_RBUTTONDOWN,?orWM_RBUTTONUP.?

            看到沒有
            WM_MOUSEWHEEL
            The?WM_MOUSEWHEEL?message?is?sent?to?the?focus?window?when?the?mouse?wheel?is?rotated.?The?DefWindowProc?function?propagates?the?message?to?the?window's?parent.?There?should?be?no?internal?forwarding?of?the?message,?since?DefWindowProc?propagates?it?up?the?parent?chain?until?it?finds?a?window?that?processes?it.

            WM_MOUSEWHEEL
            fwKeys?=?LOWORD(wParam);????//?key?flags
            zDelta?=?(short)?HIWORD(wParam);????//?wheel?rotation
            xPos?=?(short)?LOWORD(lParam);????//?horizontal?position?of?pointer
            yPos?=?(short)?HIWORD(lParam);????//?vertical?position?of?pointer
            ?
            Parameters
            fwKeys?
            Value?of?the?low-order?word?of?wParam.?Indicates?whether?various?virtual?keys?are?down.?This?parameter?can?be?any?combination?of?the?following?values:?Value?Description?
            MK_CONTROL?Set?if?the?ctrl?key?is?down.?
            MK_LBUTTON?Set?if?the?left?mouse?button?is?down.?
            MK_MBUTTON?Set?if?the?middle?mouse?button?is?down.?
            MK_RBUTTON?Set?if?the?right?mouse?button?is?down.?
            MK_SHIFT?Set?if?the?shift?key?is?down.?


            zDelta?
            The?value?of?the?high-order?word?of?wParam.?Indicates?the?distance?that?the?wheel?is?rotated,?expressed?in?multiples?or?divisions?of?WHEEL_DELTA,?which?is?120.?A?positive?value?indicates?that?the?wheel?was?rotated?forward,?away?from?the?user;?a?negative?value?indicates?that?the?wheel?was?rotated?backward,?toward?the?user.?
            xPos?
            Value?of?the?low-order?word?of?lParam.?Specifies?the?x-coordinate?of?the?pointer,?relative?to?the?upper-left?corner?of?the?screen.?
            yPos?
            Value?of?the?high-order?word?of?lParam.?Specifies?the?y-coordinate?of?the?pointer,?relative?to?the?upper-left?corner?of?the?screen.?
            Remarks
            The?zDelta?parameter?will?be?a?multiple?of?WHEEL_DELTA,?which?is?set?at?120.?This?is?the?threshold?for?action?to?be?taken,?and?one?such?action?(for?example,?scrolling?one?increment)?should?occur?for?each?delta.

            The?delta?was?set?to?120?to?allow?Microsoft?or?other?vendors?to?build?finer-resolution?wheels?in?the?future,?including?perhaps?a?freely-rotating?wheel?with?no?notches.?The?expectation?is?that?such?a?device?would?send?more?messages?per?rotation,?but?with?a?smaller?value?in?each?message.?To?support?this?possibility,?you?should?either?add?the?incoming?delta?values?until?WHEEL_DELTA?is?reached?(so?for?a?given?delta-rotation?you?get?the?same?response),?or?scroll?partial?lines?in?response?to?the?more?frequent?messages.?You?could?also?choose?your?scroll?granularity?and?accumulate?deltas?until?it?is?reached.

            回復時引用此帖 多重引用本帖 快速回復此帖 返回頂端
            北極星2003
            級別:15 | 在線時長:312小時 | 升級還需:8小時 級別:15 | 在線時長:312小時 | 升級還需:8小時 級別:15 | 在線時長:312小時 | 升級還需:8小時 級別:15 | 在線時長:312小時 | 升級還需:8小時 級別:15 | 在線時長:312小時 | 升級還需:8小時 級別:15 | 在線時長:312小時 | 升級還需:8小時

            『Win32/Win64編程』版主<br>『編程技術小組』組長
            『Win32/Win64編程』版主
            『編程技術小組』組長

            資 料:
            注冊日期: Feb 2005
            帖子: 1,224北極星2003 品行端正
            精華: 25
            現金: 1911 Kx
            4 舊 2006-08-03, 09:59 默認
            北極星2003 當前離線 添加 北極星2003 的聲望 反映此帖

            引用:
            FROM?MSDN
            The?JournalRecordProc?hook?procedure?is?an?application-defined?or?library-defined?callback?function?used?with?the?SetWindowsHookEx?function.?The?function?records?messages?the?system?removes?from?the?system?message?queue.?Later,?an?application?can?use?a?JournalPlaybackProc?hook?procedure?to?play?back?the?messages.?
            原理是從系統消息隊列中移出消息并保存
            既然你能實現鍵盤,鼠標,同樣滾輪也應該能實現(WM_MOUSEWHEEL)

            回復時引用此帖 多重引用本帖 快速回復此帖 返回頂端
            masmprogra
            級別:0 | 在線時長:1小時 | 升級還需:4小時

            初級會員
            初級會員

            資 料:
            注冊日期: Jun 2006
            帖子: 61masmprogra 品行端正
            精華: 0
            現金: 200 Kx
            5 舊 2006-08-03, 10:21 默認
            masmprogra 當前離線 添加 masmprogra 的聲望 反映此帖

            謝謝樓上兩位朋友的熱心解答~~?

            開始我也認為WM_MOUSEWHEEL應該和WM_MOUSEMOVE等消息類似,但弄了老半天就是截獲不了?

            我再看看"火紅蟻"提供的函數,找下問題在哪?

            回復時引用此帖 多重引用本帖 快速回復此帖 返回頂端
            masmprogra
            級別:0 | 在線時長:1小時 | 升級還需:4小時

            初級會員
            初級會員

            資 料:
            注冊日期: Jun 2006
            帖子: 61masmprogra 品行端正
            精華: 0
            現金: 200 Kx
            6 舊 2006-08-03, 10:35 默認
            masmprogra 當前離線 添加 masmprogra 的聲望 反映此帖

            請問"紅火蟻":

            你的意思是調用---
            SetWindowsHookEx(WH_KEYBOARD_LL,?(HOOKPROC)RecKeyProc,?AfxGetApp()->m_hInstance,?0);

            SetWindowsHookEx(WH_MOUSE_LL,?(HOOKPROC)RecMouseProc,?AfxGetApp()->m_hInstance,?0);

            那么他們會通過?lParam?返回?KBDLLHOOKSTRUCT?和?MSLLHOOKSTRUCT?指針,這兩種結構體能轉換為?EVENTMSG?結構類型嗎?

            初學鉤子方面的知識,請包含

            此帖于 2006-08-03 15:04 被 masmprogra 最后編輯
            回復時引用此帖 多重引用本帖 快速回復此帖 返回頂端
            紅火蟻
            級別:1 | 在線時長:7小時 | 升級還需:5小時

            普通會員
            普通會員

            資 料:
            注冊日期: May 2006
            帖子: 62紅火蟻 品行端正
            精華: 3
            現金: 200 Kx
            7 舊 2006-08-03, 11:18 默認
            紅火蟻 當前離線 添加 紅火蟻 的聲望 反映此帖

            我幫你做了這個簡易的鉤子,基本實現了你的功能?
            這個是dll代碼
            #include?"stdafx.h"
            #include?"GetMouseMessage.h"

            #ifdef?_DEBUG
            #define?new?DEBUG_NEW
            #undef?THIS_FILE
            static?char?THIS_FILE[]?=?__FILE__;
            #endif

            //
            //??Note!
            //
            //????If?this?DLL?is?dynamically?linked?against?the?MFC
            //????DLLs,?any?functions?exported?from?this?DLL?which
            //????call?into?MFC?must?have?the?AFX_MANAGE_STATE?macro
            //????added?at?the?very?beginning?of?the?function.
            //
            //????For?example:
            //
            //????extern?"C"?BOOL?PASCAL?EXPORT?ExportedFunction()
            //????{
            //??????AFX_MANAGE_STATE(AfxGetStaticModuleState());
            //??????//?normal?function?body?here
            //????}
            //
            //????It?is?very?important?that?this?macro?appear?in?each
            //????function,?prior?to?any?calls?into?MFC.??This?means?that
            //????it?must?appear?as?the?first?statement?within?the?
            //????function,?even?before?any?object?variable?declarations
            //????as?their?constructors?may?generate?calls?into?the?MFC
            //????DLL.
            //
            //????Please?see?MFC?Technical?Notes?33?and?58?for?additional
            //????details.
            //

            /////////////////////////////////////////////////////////////////////////////
            //?CGetMouseMessageApp

            BEGIN_MESSAGE_MAP(CGetMouseMessageApp,?CWinApp)
            ??//{{AFX_MSG_MAP(CGetMouseMessageApp)
            ????//?NOTE?-?the?ClassWizard?will?add?and?remove?mapping?macros?here.
            ????//????DO?NOT?EDIT?what?you?see?in?these?blocks?of?generated?code!
            ??//}}AFX_MSG_MAP
            END_MESSAGE_MAP()

            /////////////////////////////////////////////////////////////////////////////
            //?CGetMouseMessageApp?construction

            CGetMouseMessageApp::CGetMouseMessageApp()
            {
            ??//?TODO:?add?construction?code?here,
            ??//?Place?all?significant?initialization?in?InitInstance
            }

            /////////////////////////////////////////////////////////////////////////////
            //?The?one?and?only?CGetMouseMessageApp?object

            CGetMouseMessageApp?theApp;

            //?定義鉤子變量
            HHOOK?g_hook?=?NULL;
            extern?"C"?_declspec(dllexport)?void?EndHook(void);
            //?低級鼠標鉤子函數
            LRESULT?CALLBACK?LowLevelMouseProc(
            ????????????????????int?nCode,?????//?hook?code
            ????????????????????WPARAM?wParam,?//?message?identifier
            ????????????????????LPARAM?lParam??//?pointer?to?structure?with?message?data
            ??????????????????)
            {
            ????if?(nCode?==?HC_ACTION)
            ??{
            ????//?如果是滾動滑輪,彈出消息框,卸載鉤子函數
            ????if?(wParam?==?WM_MOUSEWHEEL)
            ????{
            ??????MessageBox(NULL,?"Get?the?mousewheel?message",?NULL,?MB_OK);
            ??????EndHook();
            ????}
            ??}

            ??return?CallNextHookEx(g_hook,?nCode,?wParam,?lParam);
            }

            //?安裝鉤子
            extern?"C"?_declspec(dllexport)?void?SetHook(void)
            {
            ??g_hook?=?SetWindowsHookEx(
            ????????????????WH_MOUSE_LL,?????????//?type?of?hook?to?install
            ????????????????LowLevelMouseProc,???//?address?of?hook?procedure
            ????????????????theApp.m_hInstance,??//?handle?to?application?instance
            ????????????????0????????????????????//?identity?of?thread?to?install?hook?for
            ??????????????);
            ??if?(g_hook?==?NULL)
            ??{
            ????MessageBox(NULL,?"SetWindowsHookEx?Failed",?NULL,?MB_OK);
            ????return?;
            ??}

            ??return?;
            }
            //?卸載鉤子
            extern?"C"?_declspec(dllexport)?void?EndHook(void)
            {
            ??if?(g_hook?!=?NULL)
            ????UnhookWindowsHookEx(g_hook);
            }

            注意,您必須在stdAfx.h中加上
            #define?_WIN32_WINNT??0x0500
            因為在winuser.h中只有定義了上面的才定義的WH_MOUSE_LL

            然后您在另外建一對話框工程
            加一個按鈕
            在工程目錄下加進上面的GetMouseMessage.dll和GetMouseMessage.lib

            在按鈕事件中寫
            extern?"C"?_declspec(dllimport)?void?SetHook(void);
            extern?"C"?_declspec(dllimport)?void?EndHook(void);

            void?CTestGetMessageDlg::OnButton1()?
            {
            ??//?TODO:?Add?your?control?notification?handler?code?here
            ??SetHook();
            }

            我試過
            完全ok

            回復時引用此帖 多重引用本帖 快速回復此帖 返回頂端
            masmprogra
            級別:0 | 在線時長:1小時 | 升級還需:4小時

            初級會員
            初級會員

            資 料:
            注冊日期: Jun 2006
            帖子: 61masmprogra 品行端正
            精華: 0
            現金: 200 Kx
            8 舊 2006-08-03, 15:04 默認
            masmprogra 當前離線 添加 masmprogra 的聲望 反映此帖

            我又查看了一下,

            SetWindowsHookEx(WH_JOURNALRECORD,?(HOOKPROC)RecHookProc,?AfxGetApp()->m_hInstance,?0);

            能捕獲WM_MOUSEWHEEL消息,問題是出在

            SetWindowsHookEx(WH_JOURNALPLAYBACK,?(HOOKPROC)PlayHookProc,?AfxGetApp()->m_hInstance,?0);

            無法播放錄制下來的滾輪動作.?

            原因我還在查找中,謝謝"紅火蟻"的熱心幫助.

            回復時引用此帖 多重引用本帖 快速回復此帖 返回頂端
            masmprogra
            級別:0 | 在線時長:1小時 | 升級還需:4小時

            初級會員
            初級會員

            資 料:
            注冊日期: Jun 2006
            帖子: 61masmprogra 品行端正
            精華: 0
            現金: 200 Kx
            9 舊 2006-08-03, 16:05 默認
            masmprogra 當前離線 添加 masmprogra 的聲望 反映此帖

            徹底郁悶了...???

            在codeproject的帖子里找到了答案,詳情如下:

            ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            WM_MOUSEWHEEL?cannot?work??

            I?downloaded?and?use?it?to?test?out?Notepad.
            It?seems?like?the?WM_MOUSEWHEEL?can?be?recorded,?but?when?it?is?played?back?in?NotePad,?the?playback?does?not?"wheel"?or?scroll?the?notepad?app.

            You?can?easily?try?it?out?in?notepad.?just?type?in?many?line?to?make?Notepad?scrollbar?appear.?Record?the?mouse?wheel?and?play?it?back.

            Any?idea?how?to?make?Mouse?Wheel?work?
            ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            Re:?WM_MOUSEWHEEL?cannot?work??

            Yes,?this?is?a?bug??in?the?journal?playback?system.?Unfortunately,?there's?nothing?I?can?do

            Regards
            Senthil
            ??

            91精品国产91久久综合| 久久综合一区二区无码| 中文字幕热久久久久久久| 久久人妻无码中文字幕| 久久久久亚洲AV无码麻豆| 1000部精品久久久久久久久| 久久成人精品视频| 日韩欧美亚洲综合久久| 久久国产色AV免费看| 久久不见久久见免费影院www日本| 色综合久久天天综线观看| 精品久久久久久亚洲精品| 久久久久国色AV免费观看 | 久久不见久久见免费影院www日本| 亚洲欧美另类日本久久国产真实乱对白 | 久久99精品国产99久久6男男| 亚洲国产成人久久综合一区77| 久久久久人妻精品一区| 欧美午夜精品久久久久久浪潮| 久久精品国产亚洲AV电影| 久久婷婷五月综合色奶水99啪| 国产成人精品久久一区二区三区av | 狼狼综合久久久久综合网| 久久久久亚洲?V成人无码| 久久伊人精品青青草原高清| 午夜精品久久久久久99热| 久久精品这里只有精99品| 狠狠色婷婷综合天天久久丁香 | 国内精品人妻无码久久久影院导航| 亚洲国产精久久久久久久| 亚洲AV无一区二区三区久久| 性做久久久久久免费观看| 伊人久久综在合线亚洲2019| 国产精品99久久久久久人| 精品久久久久久中文字幕人妻最新| 精品人妻伦九区久久AAA片69| 四虎国产精品成人免费久久| 亚洲国产小视频精品久久久三级| 久久亚洲av无码精品浪潮| 亚洲欧美成人久久综合中文网| 久久亚洲精品国产精品婷婷|