sgxluck 发表于 2009-5-26 22:50:59

鼠标钩子截获鼠标滚轮信息!VC++

这几天在写一个关于鼠标勾子的程序,只想拦截鼠标滚轮并判断滚轮是上滚还是下滚.查了一些资料,没有什么进展,望兄弟帮俺一把!

watercat 发表于 2009-5-26 22:58:41

所有涉及硬件控制的编程,用Windows都会很累、非常累

如果你的项目不是非得锁定在Windows下,不妨换Linux试试看,会让你有一种[换了一片天地]的感觉的……

sgxluck 发表于 2009-5-26 23:12:06

呵呵,我WINDOWS也还用不好,用么子LINUX.
没办法,客户要用的东西,用LINUX真的说不过去.再来工程基本完成就差这点了!希望能帮上忙的兄弟协助一把!
回贴的兄弟,我都先谢了!!!

watercat 发表于 2009-5-27 00:38:44

那就帮不上你了,Windows我实在没心情再捡起来用……

不过如果你的程序是通过内嵌的浏览器内核配合本地页面实现的(现在很多程序都这么做的),那倒也不难,直接用JS实现即可

xcm_gz 发表于 2009-5-27 02:48:55

kb_proc是键盘的消息出来,鼠标的你自己改一下吧。
点击此处下载 ourdev_448324.rar(文件大小:622K) (原文件名:钩子2.rar)

#define   _WIN32_WINNT         0x400   
#define   STRICT   
#define   WIN32_LEAN_AND_MEAN   
      
#include   <stdio.h>   
#include   <stdlib.h>   
#include   <windows.h>   
      
DWORD       g_main_tid   =   0;   
HHOOK       g_kb_hook       =   0;   
      
BOOL   CALLBACK   con_handler   (DWORD)   
         
{   
      PostThreadMessage   (g_main_tid,   WM_QUIT,   0,   0);   
      return   TRUE;   
};   
      
LRESULT   CALLBACK   kb_proc   (int   code,   WPARAM   w,   LPARAM   l)      
{   
      PKBDLLHOOKSTRUCT   p   =   (PKBDLLHOOKSTRUCT)l;   

      const   char   *info   =   NULL;   
      if   (w   ==   WM_KEYDOWN)   
            info   =   "key   dn";   
      else   if   (w   ==   WM_KEYUP)   
            info   =   "key   up";   
      else   if   (w   ==   WM_SYSKEYDOWN)   
            info   =   "sys   key   dn";   
      else   if   (w   ==   WM_SYSKEYUP)   
            info   =   "sys   key   up";   

      printf   ("%s   -   vkCode   [%04x],   scanCode   [%04x]\n",   
            info,   p->vkCode,   p->scanCode);   
      //   always   call   next   hook   

      return   CallNextHookEx   (g_kb_hook,   code,   w,   l);   
         
};   
      
int   main   (void)   
{   
          g_main_tid   =   GetCurrentThreadId   ();   
          SetConsoleCtrlHandler   (&con_handler,   TRUE);   
          g_kb_hook   =   SetWindowsHookEx   (   
//                          WH_KEYBOARD_LL,   
                          WH_MOUSE_LL,   
                          &kb_proc,   
                          GetModuleHandle   (NULL),   // 不能为NULL,否则失败   
                          0);   

          if   (g_kb_hook   ==   NULL)   
          {   
                          fprintf   (stderr,   
                                          "SetWindowsHookEx   failed   with   error   %d\n",   
                                          ::GetLastError   ());   
                          return   0;   
          };   

          //   消息循环是必须的,想知道原因可以查msdn   

          MSG   msg;   
          while   (GetMessage   (&msg,   NULL,   0,   0))   
          {   
                          TranslateMessage   (&msg);   
                          DispatchMessage   (&msg);   
          };   
          UnhookWindowsHookEx   (g_kb_hook);   
          return   0;   
};

xcm_gz 发表于 2009-5-27 02:57:21

http://cache.amobbs.com/bbs_upload782111/files_15/ourdev_448326.JPG
(原文件名:1.JPG)

xcm_gz 发表于 2009-5-27 11:21:32

extern _declspec(dllexport) LRESULT CALLBACK WINAPI LowLevelMouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode == 0)
    {
      PMSLLHOOKSTRUCT l = (PMSLLHOOKSTRUCT)lParam;
                  if (wParam==WM_MOUSEWHEEL)
                  {
                        printf("zDelta=%d\n",l->mouseData);                        
                  }
    }
    return CallNextHookEx(g_kb_hook, nCode, wParam, lParam);
}

g_kb_hook=SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc, GetModuleHandle(NULL),0);

sgxluck 发表于 2009-5-27 14:59:13

谢谢,非常感谢 xcm_gz
我先研究研究哈!
页: [1]
查看完整版本: 鼠标钩子截获鼠标滚轮信息!VC++