用钩子啊
SetWindowsHookEx(WH_MOUSE,MouseHookCallBack,
                                GetModuleHandleFromInstance, GetCurrentThreadID);
function MouseHookCallBack(Code: integer; Msg: WPARAM;
                          MouseHook: LPARAM): LRESULT; stdcall;看看Msg,MouseHook参数里面的内容应该有你要的位置信息

解决方案 »

  1.   

    用热键wm_hotkey和getcursorpos可以得到位置的
      

  2.   

    用钩子的确可以解决,但那样好想挺麻烦的,我想应该有更好的解决方案。你们看下面的方法是哪儿出问题,
    SetCapture(GetDesktopWindow),然后在主程序种截取WM_LBUTTONDOWN,但这样得不到鼠标在窗体外的消息!
      

  3.   

    用一个Timer定时调用getcursorpos就可以得知当前鼠标的位置,然后再判断鼠标按钮是否按下。程序很简单,不必使用Hook。
      

  4.   

    to dengzhen:
      你这样好象只能得到鼠标在本程序窗口单击时的坐标,在其它程序窗口上的单击时坐标无法得到!
      

  5.   

    可以用捕捉鼠标左键的消息,然后求出此时的坐标:
    var CurPos:TPoint; //全屏幕下的鼠标坐标
    ......
    if (Msg.LParam=WM_LBUTTONDOWN) then    //响应鼠标左键消息
         GetCursorPos(CurPos);  //获得鼠标坐标
      

  6.   

    getcursorpos()是一个API函数,可以得到窗体以外的鼠标坐标,没问题的:)
      

  7.   

    getcursorpos()是可以得到窗体以外的鼠标坐标的
      

  8.   

    getcursorpos()的确可以得到窗体以外的鼠标坐标,但是无法获得在窗体外的单击事件.所以这样
    还是行不通的,难道除了用钩子就没办法了吗???
      

  9.   

    setcapture的确可以捕捉窗体外的时间,但是当点击窗体外以后,将会失去捕捉到的鼠标。
    建议还是用mouse hook解决,如需要的话,我可以把我做的一个屏幕取色的程序寄给你参考一下
      

  10.   

    我也想知道,有试了一些方法,没有解决。有办法请E-Mail [email protected]
      

  11.   

    var
      Point:tpoint;
    begin
      getcursorpos(point)
      x:=point.x;
      y:=point.y;
    end;x y 为鼠标单击后的坐标
      

  12.   

    to zhujunfeng:
     非常感谢,我很想看一下您的屏幕取色的程序!
    我的信箱是: [email protected]
    谢谢您!