获取其他线程的光标句柄[DELPHI]

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。本文阐述如何在任何线程掌握光标时都能够获取光标句柄。

=========================================================

{

当光标被另外一个线程掌握时,就无法用GetCursor()应用接口获得光标句柄。

本文阐述如何在任何线程掌握光标时都能够获取光标句柄。

例如,想在屏幕截取程序中放置光标时该如何做。

}

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;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航