小弟初次接触delphi,不太懂怎么查找自己需要的函数资料,我看到一个键盘鼠标dll中用到了下面一个type,对于鼠标,最后有个MouseStruct,可能是保存鼠标坐标位置,但不知这个"MouseStruct"在哪里查?请问这里面是否保存了鼠标按键?就是说我想清楚知道是按下了哪一个鼠标键,我在键盘dll中没看到这个结构,只有一个KeyCode,如果我要在DLL中区分左右鼠标,是否也该加上一个KeyCode?
以上,请大虾帮忙解答一下:如果我想在DLL中非常清楚地知道是按下了哪一个鼠标键,该如何实现呢?type
TMappingMem = record
Handle: DWORD;
MsgID: DWORD;
KeyCode: DWORD;//////////////////////////这是我自己加的,不过一点用都没有,也不影响原来的代码.
MouseStruct: TMOUSEHOOKSTRUCT;
end;
PMappingMem = ^TMappingMem;
以上,请大虾帮忙解答一下:如果我想在DLL中非常清楚地知道是按下了哪一个鼠标键,该如何实现呢?type
TMappingMem = record
Handle: DWORD;
MsgID: DWORD;
KeyCode: DWORD;//////////////////////////这是我自己加的,不过一点用都没有,也不影响原来的代码.
MouseStruct: TMOUSEHOOKSTRUCT;
end;
PMappingMem = ^TMappingMem;
pt: TPoint;
hwnd: HWND;
wHitTestCode: UINT;
dwExtraInfo: DWORD;
end;
TMouseHookStruct = tagMOUSEHOOKSTRUCT;
具体是哪个键被按下,不是从TMouseHookStruct 中得到的,你应该自己定义鼠标钩子回调函数
用SetWindowsHookEx进行设置
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;
是这里吧?我想在这里判断左右键,可我不知道如何将判断出的结果传递给内存映射...
SetWindowsHookEx(WH_MOUSE,@MouseHookProc,Hinstance,0);
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.我要在这里判断左右键,括号里的参数应该怎么设置呢? 希望能够帮帮我,谢谢了!
function GetKey(index: Integer): Char; export;
begin
Result := Shared^.Keys[index];
end;可能就像这样吧?我先试下
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);
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可能有点让我难受....不过我一顿乱搞,还搞成了,哈哈