小弟初次接触delphi,不太懂怎么查找自己需要的函数资料,我看到一个键盘鼠标dll中用到了下面一个type,对于鼠标,最后有个MouseStruct,可能是保存鼠标坐标位置,但不知这个"MouseStruct"在哪里查?请问这里面是否保存了鼠标按键?就是说我想清楚知道是按下了哪一个鼠标键,我在键盘dll中没看到这个结构,只有一个KeyCode,如果我要在DLL中区分左右鼠标,是否也该加上一个KeyCode?
以上,请大虾帮忙解答一下:如果我想在DLL中非常清楚地知道是按下了哪一个鼠标键,该如何实现呢?type
  TMappingMem = record
    Handle: DWORD;
    MsgID: DWORD;
    KeyCode: DWORD;//////////////////////////这是我自己加的,不过一点用都没有,也不影响原来的代码.
    MouseStruct: TMOUSEHOOKSTRUCT;
  end;
  PMappingMem = ^TMappingMem;

解决方案 »

  1.   

    TMOUSEHOOKSTRUCT在Windows单元有定义  tagMOUSEHOOKSTRUCT = packed record
        pt: TPoint;
        hwnd: HWND;
        wHitTestCode: UINT;
        dwExtraInfo: DWORD;
      end;
      TMouseHookStruct = tagMOUSEHOOKSTRUCT;
    具体是哪个键被按下,不是从TMouseHookStruct 中得到的,你应该自己定义鼠标钩子回调函数
    用SetWindowsHookEx进行设置
      

  2.   

    <Delphi下深入Windows核心编程>一书中有很详细的例子,也可以到网上下载他的附书源码
      

  3.   

    function MouseHookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall
    begin
      if fblocked then
        Result := 0
      else
        Result := 0;  if iCode < 0 then
        CallNextHookEx(mhook, iCode, wParam, lParam);  case wParam of
        WM_MOUSEMOVE, WM_NCMouseMove:
          begin
            pMapMem^.MsgID := MSG_MOUSEMOVE;
            pMapMem^.MouseStruct := pMOUSEHOOKSTRUCT(lparam)^;
            SendMessage(pMapMem^.Handle, pMapMem^.MsgID, 0, 0);      end;
        WM_LBUTTONDOWN, WM_NCLBUTTONDOWN:
          begin
            pMapMem^.KeyCode := wParam;
            pMapMem^.MsgID := MSG_MOUSECLICK;
            pMapMem^.MouseStruct := pMOUSEHOOKSTRUCT(lparam)^;
            SendMessage(pMapMem^.Handle, pMapMem^.MsgID, 0, 0);
          end;
        WM_LBUTTONUP:
          begin
          end;
        WM_LBUTTONDBLCLK:
          begin
          end;
        WM_RBUTTONDOWN:
          begin
            pMapMem^.KeyCode := wParam;
            pMapMem^.MsgID := MSG_MOUSECLICK;
            pMapMem^.MouseStruct := pMOUSEHOOKSTRUCT(lparam)^;
            SendMessage(pMapMem^.Handle, pMapMem^.MsgID, 0, 0);
          end;
        WM_RBUTTONUP:
          begin
          end;
        WM_RBUTTONDBLCLK:
          begin
          end;
        WM_MBUTTONDOWN:
          begin
          end;
        WM_MBUTTONUP:
          begin
          end;
        WM_MBUTTONDBLCLK:
          begin
          end;
      end;end;
    是这里吧?我想在这里判断左右键,可我不知道如何将判断出的结果传递给内存映射...
      

  4.   

    那个wParam不就是保存了左右键的信息吗?可我传递不出...
      

  5.   

    设置钩子时这样
    SetWindowsHookEx(WH_MOUSE,@MouseHookProc,Hinstance,0);
      

  6.   

    SetWindowsHookEx可以与内存映射实现共享吧?我在SetWindowsHookEx中通过设置鼠标左右键来改变映射中的pMapMem^.KeyCode,就可以得到左右键了吧?但我在应用程序exe中,怎么设置参数才能传递左右键呢?就是这里:procedure TForm1.HookMouseClick(const h: HWND; const X, Y: Integer);
    begin
      // 鼠标消息测试 OnClick
      Label2.Caption := Format('Click at: WND: %d - X: %d - Y: %d', [h, x, y]);
      //Label2.Caption :='We get a MouseClik message'end;end.我要在这里判断左右键,括号里的参数应该怎么设置呢?   希望能够帮帮我,谢谢了!
      

  7.   

    Delphi下深入Windows核心编程 的原码我刚才已经下了一份,但这里面只有鼠标位置的原码,键盘的我有,区分左右键的我暂时还没有找到..
      

  8.   

    我找到一段带码,是这样的:
    function GetKey(index: Integer): Char; export;
    begin
      Result := Shared^.Keys[index];
    end;可能就像这样吧?我先试下
      

  9.   


    function MouseHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    begin
      if wParam = WM_LBUTTONDOWN then //右键
      begin
        ... // 右键反应
      end;
      Result := CallNextHookEx(hook, nCode, wParam, lParam);
    end;//设置勾子
    hook := SetWindowsHookEx(WH_MOUSE, @MouseHook, HInstance, 0);
      

  10.   

    各位大虾,帮忙再回来帮我检查一下,我自己弄的,呵呵,发发你们的最后意见,我就结贴了:在dll里面,在开头部分:
    TMappingMem = record
        Handle: DWORD;
        MsgID: DWORD;
        KeyCode: Integer;///////////////////////////这里,我定义了一个KeyCode保存左右键
        MouseStruct: TMOUSEHOOKSTRUCT;
      end;然后在这里
    function MouseHookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall
    我通过W参数设置KeyCode:
      case wParam of
        WM_MOUSEMOVE, WM_NCMouseMove:
          begin
            pMapMem^.MsgID := MSG_MOUSEMOVE;
            pMapMem^.MouseStruct := pMOUSEHOOKSTRUCT(lparam)^;
            SendMessage(pMapMem^.Handle, pMapMem^.MsgID, 0, 0);      end;
        WM_LBUTTONDOWN, WM_NCLBUTTONDOWN:
          begin
            pMapMem^.KeyCode := wParam;
            pMapMem^.MsgID := MSG_MOUSECLICK;
            pMapMem^.MouseStruct := pMOUSEHOOKSTRUCT(lparam)^;
            SendMessage(pMapMem^.Handle, pMapMem^.MsgID, 0, 0);
          end;
        WM_LBUTTONUP:
          begin
          end;
        WM_LBUTTONDBLCLK:
          begin
          end;
        WM_RBUTTONDOWN:
          begin
            pMapMem^.KeyCode := wParam;
            pMapMem^.MsgID := MSG_MOUSECLICK;
            pMapMem^.MouseStruct := pMOUSEHOOKSTRUCT(lparam)^;
            SendMessage(pMapMem^.Handle, pMapMem^.MsgID, 0, 0);
          end;
       end然后我定义了一个Function:function GetKey: integer; export;
    begin
      Result := pMapMem^.KeyCode;
    end;最后我在EXE中通过GetKey取得pMapMem^.KeyCode,如下:procedure TForm1.HookMouseClick(const h: HWND; const X, Y: Integer);
    begin
      // 鼠标消息测试 OnClick
      Label1.Caption := Format('Click at: WND: %d - X: %d - Y: %d', [h, x, y]);
      Label2.Caption := IntToStr(GetKey);
    end;不过我有一点搞不明白,怎么左键的值是513,右键的值是516啊?????但如果每次都这样,我就当它成功了,不过500多的数字,我觉得太大了啊.VB里面鼠标都是0或者1的~不好意思,VB转delphi可能有点让我难受....不过我一顿乱搞,还搞成了,哈哈