function GetCursorHandle: HCURSOR; var hWindow: HWND; pt: TPoint; pIconInfo: TIconInfo; dwThreadID, dwCurrentThreadID: DWORD; begin // 检查哪个窗体掌握光标 GetCursorPos(pt); hWindow := WindowFromPoint(pt); // 获得光标所有者的线程ID dwThreadID := GetWindowThreadProcessId(hWindow, nil); // 获得当前线程的ID dwCurrentThreadID := GetCurrentThreadId; // 如果光标所有者的线程不是当前线程,就要把光标所有者的线程配属到当前线程。 //然后调用GetCursor()来获得正确的光标句柄(hCursor)。 if (dwCurrentThreadID <> dwThreadID) then begin if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then begin // 获得光标句柄 Result := GetCursor; AttachThreadInput(dwCurrentThreadID, dwThreadID, False); end; end else begin Result := GetCursor; end; end;procedure TForm1.Button1Click(Sender: TObject); var CurPosX, CurPoxY: Integer; MyCursor: TIcon; pIconInfo: TIconInfo; begin MyCursor := TIcon.Create; try MyCursor.Handle := GetCursorHandle; // 获得光标位置 GetIconInfo(MyCursor.Handle, pIconInfo); CurPosX := pIconInfo.xHotspot; CurPoxY := pIconInfo.yHotspot; // 在窗体上画出光标 Canvas.Draw(CurPoxY, CurPoxY, MyCursor); finally MyCursor.ReleaseHandle; MyCursor.Free; end; end;// 另外一种解决办法:procedure TForm1.Timer1Timer(Sender: TObject); var CI: TCursorInfo; begin CI.cbSize := SizeOf(CI); GetCursorInfo(CI); Image1.Picture.Icon.Handle := CI.hCursor; end;
woshihaoge(支离破碎): 你的方法不错,我试验了一下,可以看到变化。 可是我用在自己的程序中有点问题。我写了一个程序让鼠标移动,我想让鼠标图标发生变化的时候取得信息。用逆的方法在计时器中很好用,在我的鼠标移动中却要等到鼠标移动结束后才起作用。() procedure TForm1.Button1Click(Sender: TObject); var s1:Tpoint; var x1,y1,I:integer; begin windows.GetCursorPos(s1); x1:=s1.X ; y1:=s1.Y ; bstop:=0; for I := 1 to 200 do begin windows.mouse_event (1,1,0,1,0,); Image1.Picture.Icon.Handle := GetCursorHandle;//这里即使遇到变化也不起作用?? end; end;
var
hWindow: HWND;
pt: TPoint;
pIconInfo: TIconInfo;
dwThreadID, dwCurrentThreadID: DWORD;
begin
// 检查哪个窗体掌握光标
GetCursorPos(pt);
hWindow := WindowFromPoint(pt); // 获得光标所有者的线程ID
dwThreadID := GetWindowThreadProcessId(hWindow, nil); // 获得当前线程的ID
dwCurrentThreadID := GetCurrentThreadId; // 如果光标所有者的线程不是当前线程,就要把光标所有者的线程配属到当前线程。
//然后调用GetCursor()来获得正确的光标句柄(hCursor)。 if (dwCurrentThreadID <> dwThreadID) then
begin
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
begin
// 获得光标句柄
Result := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
end;
end else
begin
Result := GetCursor;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
CurPosX, CurPoxY: Integer;
MyCursor: TIcon;
pIconInfo: TIconInfo;
begin
MyCursor := TIcon.Create;
try
MyCursor.Handle := GetCursorHandle;
// 获得光标位置
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
// 在窗体上画出光标
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
finally
MyCursor.ReleaseHandle;
MyCursor.Free;
end;
end;// 另外一种解决办法:procedure TForm1.Timer1Timer(Sender: TObject);
var
CI: TCursorInfo;
begin
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
end;
你的方法不错,我试验了一下,可以看到变化。
可是我用在自己的程序中有点问题。我写了一个程序让鼠标移动,我想让鼠标图标发生变化的时候取得信息。用逆的方法在计时器中很好用,在我的鼠标移动中却要等到鼠标移动结束后才起作用。()
procedure TForm1.Button1Click(Sender: TObject);
var s1:Tpoint;
var x1,y1,I:integer;
begin
windows.GetCursorPos(s1);
x1:=s1.X ;
y1:=s1.Y ;
bstop:=0;
for I := 1 to 200 do
begin
windows.mouse_event (1,1,0,1,0,);
Image1.Picture.Icon.Handle := GetCursorHandle;//这里即使遇到变化也不起作用??
end;
end;