关于SetCursorPos和WH_MOUSE_LL的问题

cds27 2009-05-22 03:54:33

IntPtr hookProc(int code, IntPtr wparam, IntPtr lparam)
{
if (code < 0) return CallNextHookEx(_nextHookPtr, code, wparam, lparam);

MSLLHOOKSTRUCT msllStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lparam, typeof(MSLLHOOKSTRUCT));
if (msllStruct.pt.X>=300)
{
this.Text = Cursor.Position.ToString();
SetCursorPos(300, msllStruct.pt.Y);
}

return IntPtr.Zero;
}

public void SetHook()
{
if (_nextHookPtr != IntPtr.Zero)
{
return;
}

HookProc myhookProc = new HookProc(hookProc);
//_nextHookPtr = SetWindowsHookEx((int)HookType.MouseLL, myhookProc, IntPtr.Zero, GetCurrentThreadId());
_nextHookPtr = SetWindowsHookEx((int)HookType.MouseLL, myhookProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
}


这段代码是全局的鼠标HOOK,让鼠标x坐标大于300的时候,回到300。
但只有当鼠标点了左右键的时候,光标才会回到300。
该如何解决呢?

请不要回复我Cursor.Clip = .......... ,我只是想了解上述代码的问题,和解决方法
...全文
236 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CsToD 2009-05-22
  • 打赏
  • 举报
回复
那就是你代码有问题了,因为捕获的是鼠标的所有动作,包括左右键,鼠标移动,滚轮轮动等,所以不可能点击起作用,而移动鼠标不起作用,你代码写错了,不应该返回IntPtr.Zerg,而始终是CallNextHookEx的返回值,你试试这样:

IntPtr hookProc(int code, IntPtr wparam, IntPtr lparam)
{
MSLLHOOKSTRUCT msllStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lparam, typeof(MSLLHOOKSTRUCT));
if (msllStruct.pt.X>=300)
{
this.Text = Cursor.Position.ToString();
SetCursorPos(300, msllStruct.pt.Y);
}
return CallNextHookEx(_nextHookPtr, code, wparam, lparam);
}

xudongdong1990 2009-05-22
  • 打赏
  • 举报
回复
帮顶了
cnzdgs 2009-05-22
  • 打赏
  • 举报
回复
if (code < 0) return CallNextHookEx(_nextHookPtr, code, wparam, lparam);
另外,全局Hook要用DLL来做,SetWindowsHookEx的第3参数给DLL的ModuleHandle。
cds27 2009-05-22
  • 打赏
  • 举报
回复
有响应,this.Text = Cursor.Position.ToString(); 这句还有被执行,可以可按到坐标的变化。眼睁睁的看着坐标超出范围。
vandersar1203 2009-05-22
  • 打赏
  • 举报
回复
如果只有按键被hook到,是不是米有响应WM_MOUSEMOVE 消息?
from MSDN:
The WM_MOUSEMOVE message is posted to a window when the cursor moves. If the mouse is not captured, the message is posted to the window that contains the cursor. Otherwise, the message is posted to the window that has captured the mouse.

A window receives this message through its WindowProc function.

cds27 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zgke 的回复:]
晕~~杀鸡能用上牛刀~~ 如果控制鼠标.NET就可以了 搞的钩子什么都上来了....

Cursor.Position = new Point(300, 300);
[/Quote]
你误会了,看来我还是要把之前的帖搞上来,不然大家会误会我的本意。
你看一下这个就明白了,http://topic.csdn.net/u/20090519/15/17473596-48dc-406d-b192-a527e60d8614.html
顺便看看能不能帮我解决这个问题。
zgke 2009-05-22
  • 打赏
  • 举报
回复
晕~~杀鸡能用上牛刀~~ 如果控制鼠标.NET就可以了 搞的钩子什么都上来了....

Cursor.Position = new Point(300, 300);
feifeiyiwen 2009-05-22
  • 打赏
  • 举报
回复
up

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧