怎么获取其他线程的光标句柄
解决方案 »
- delphi怎样隐藏窗体呢?
- MSComm控件安装后,在ActiveX面板中找不到相应的组件
- 一个关于网络连接的问题,请各位专业人士指教!
- 请教delphi里面有没有可以指定截取一段字符串的一部分的函数啊?
- 打开文件问题???????????
- 台湾正在搞国旗设计
- 讨论一下数据库结构建立问题。
- 組件消息高手進!在DELPHI中用PERFORM從一個組件類的事件代碼中傳自定義的消息到它的OWNER(如果是FORM),如何在該FORM的消息處理方法的代碼
- 存储过程高手,近来看一下!!
- 送分简单问题
- 在数据库服务器死机的情况下,如何保证工作站查询的情况下不死机?
- 请问我在那里能找到installshield express这个专门制作安装程序的工具啊!delphi7.0自身带了的吗? 在线等!!!一分钟刷新一次!
{
当光标被另外一个线程掌握时,就无法用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;