获取其它程序的鼠标坐标。(200分)

  • 主题发起人 主题发起人 hying95
  • 开始时间 开始时间
H

hying95

Unregistered / Unconfirmed
GUEST, unregistred user!
我想建一个程序,在窗口放一个button和一个memo,一按按纽,指定的其它程序窗口获得焦点,并开始记录指定窗口鼠标坐标(鼠标左键点一下记一下)按END键结束记录,并把焦点转到自己程序,把坐标数据显示到MEMO中。
 
1、用GetCursorPos得到Cursor的绝对坐标;
2、用WindowFromPoint得到窗口的handle;
3、用GetWindowRect得到left/top值;
4、用GetCursorPos得到的x/y去减left/top就是你想要的坐标值。
 
但我不会用啊!
 
有这样源码的朋友请发一份给我,不胜感谢!jiangjianguo29@163.com
 
RedBeret:贴上示例好吗?
 
苦苦等待答案。
 
鼠标移到其它程序内,我的程序就已经失去焦点,怎么处理。怎么能得到鼠标的坐标呢?
 
远程代码注入, 之后用SetWindowLongPtr改变原来窗口的窗口函数。
或者索性直接用钩子吧……
 
我是作服装结构设计的,空闲时间特多,于是就学DELPHI编程,还是自学,我们这个部门的CAD能读DXF文件,而另一部门的程序不能输出DXF文件,因此我只能点一下鼠标记下X,Y坐标,然后把坐标输入我写的一个程序,保存为DXF文件,要不就需要打印出来,再用数化板读入,这样太麻烦了,我就想能不能运行我的程序,记录鼠标的坐标,不用手工记.于是就找资料,但自已天资太笨,弄了很久也弄不出来,恳请高手帮忙,小弟在此多谢了.
 
给我设计一套服装,我就给你写代码。以前回复过的。。如下
(或链接: http://www.delphibbs.com/delphibbs/dispq.asp?lid=3373886)
方法一: 添加一Timer ,定义一个Tpoint变量pt,在onTimer中 getCursorPos(pt);label1.caption:=inttostr(pt.x)+' '+inttostr(pt.y);即可。

方法二:点右键显示坐标,主程序代码:
unit mainWnd;
interface
uses
{ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,shellapi, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
public
{ Public declarations }
procedure wndProc(var mess:TMessage);override;
private
{ Private declara }
end;

var
Form1: TForm1;
myMessage:UINT;
implementation
{$R *.dfm}
procedure installMouseHook;external './hookdll.dll';
procedure unHookMouseHook;external './hookdll.dll';
procedure byMain( wnd:Hwnd);external './hookdll.dll';
procedure TForm1.wndProc(var mess:TMessage);
begin
if mess.Msg=myMessage then
begin
label1.Caption:='X'+inttostr(mess.wparam)+' Y'+inttostr(mess.lparam);
end else
inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
byMain(form1.handle);
installMouseHook;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
unHookMouseHook;
end;
begin
myMessage:=registerWindowMessage(pchar('sxw'));
end.
//dll中代码为
library hookdll;
uses
ShareMem,
Windows,
Classes,
Controls,
Dialogs,
SysUtils,
shellapi,
Qt;
{$R *.res}

var mousehook:HHook;
callMessage:UINT;
mainwindow:Hwnd;
procedure byMain(wnd:Hwnd);
begin
mainWindow:=wnd;
end;
function MouseProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
var p:^MOUSEHOOKSTRUCT;
begin

p:=ptr(lParam);
if (wParam=516) and (ncode>=0) then
sendMessage(hwnd_broadCast,callMessage,p^.pt.x,p^.pt.y);
result:=callNextHookEx(mouseHook,nCode,wParam,lParam);
end;


procedure installMouseHook;stdcall;
begin
mousehook:=setWindowsHookEx(WH_MOUSE,@MouseProc,Hinstance,0);
end;
procedure unHookMouseHook;stdcall;
begin
if mousehook<>0 then
begin
unHookWindowsHookEx(mousehook);
end;
end;

exports
unHookMouseHook,
installMouseHook,
byMain;
begin
callMessage:=registerWindowMessage('sxw');
end.

结帐吧!
 
不过要按end退出 还需要在mouseProc中发一个退出消息,然后处理。你要获得焦点的窗口是CAD 还是你的主程序窗口 ?。(右键记录)。
 
RedBeret 已经说的很清楚了只要把那些方法放到timer里就可以了。RedBeret [^][:)]
 
有个记录鼠标动作的程序。。。找找
 
在CAD窗口操作结束后,按END键回到我的主程序窗口,刚刚鼠标坐标显示到MEMO中.
 
smallstomach把你的体型特征资料发一份给我,我帮你设计.
 
编译DLL时出错,末发现Qt.dcu
 
多看参考资料吧
 
Qt单元有要的虚键参数,不过你可以用值代替那些参数。之前试验时用的,上面好像没用到,不过用END键时你就用它的值吧。 wparam和lparam都用完了,要用end来呼出主窗口,你最好用共享内存把主窗口handle存进去,然后取出发送,在消息处理中加入 setForeGroundWindow(self.handle)就可以了,以前我做过的。
警告:不要指望在DLL中设一个 Thandle变量来保存它
单位今晚庆“七一”建党85周年合唱演出量做的服装每个人的都大了好多,骂成一片,还说是从南方空运过来的,被南方人骗了,唉!
 
被领导骗了还是被南方人骗了?
smallstomach你的方法可以,鼠标在主程序内移动没问题,但如果移到桌面上,点几下最后回到主程序内点Button2时出错:
Explorer.exe-应用程序错误
&quot;0x00000000&quot;指令引用的&quot;0x00000000&quot;内存,该内存不能为&quot;read&quot;
鼠标移到CAD程序内,点几下鼠标左键,然后回到主程序按button2时出错如下:
System Error
EXCEPTION ACCESS VIOLATION
ExceptionCode: cOOOOOO5
ExceptionFlags:0
ExceptionAddress:00000000
NumberParameters:2
Startup Address:0051F770
Offset of Exception:FFAEO890
确定
 
后退
顶部