當(dāng)光標(biāo)被另外一個(gè)線程掌握時(shí),就無法用GetCursor()應(yīng)用接口獲得光標(biāo)句柄。本文闡述如何在任何線程掌握光標(biāo)時(shí)都能夠獲取光標(biāo)句柄。
=========================================================
{
當(dāng)光標(biāo)被另外一個(gè)線程掌握時(shí),就無法用GetCursor()應(yīng)用接口獲得光標(biāo)句柄。
本文闡述如何在任何線程掌握光標(biāo)時(shí)都能夠獲取光標(biāo)句柄。
例如,想在屏幕截取程序中放置光標(biāo)時(shí)該如何做。
}
function GetCursorHandle: HCURSOR;
var
hWindow: HWND;
pt: TPoint;
pIconInfo: TIconInfo;
dwThreadID, dwCurrentThreadID: DWord;
begin
// 檢查哪個(gè)窗體掌握光標(biāo)
GetCursorPos(pt);
hWindow := WindowFromPoint(pt);
// 獲得光標(biāo)所有者的線程ID
dwThreadID := GetWindowThreadPRocessId(hWindow, nil);
// 獲得當(dāng)前線程的ID
dwCurrentThreadID := GetCurrentThreadId;
// 如果光標(biāo)所有者的線程不是當(dāng)前線程,就要把光標(biāo)所有者的線程配屬到當(dāng)前線程。
//然后調(diào)用GetCursor()來獲得正確的光標(biāo)句柄(hCursor)。
if (dwCurrentThreadID <> dwThreadID) then
begin
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
begin
// 獲得光標(biāo)句柄
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;
// 獲得光標(biāo)位置
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
// 在窗體上畫出光標(biāo)
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
finally
當(dāng)光標(biāo)被另外一個(gè)線程掌握時(shí),就無法用GetCursor()應(yīng)用接口獲得光標(biāo)句柄。本文闡述如何在任何線程掌握光標(biāo)時(shí)都能夠獲取光標(biāo)句柄。
=========================================================
{
當(dāng)光標(biāo)被另外一個(gè)線程掌握時(shí),就無法用GetCursor()應(yīng)用接口獲得光標(biāo)句柄。
本文闡述如何在任何線程掌握光標(biāo)時(shí)都能夠獲取光標(biāo)句柄。
例如,想在屏幕截取程序中放置光標(biāo)時(shí)該如何做。
}
function GetCursorHandle: HCURSOR;
var
hWindow: HWND;
pt: TPoint;
pIconInfo: TIconInfo;
dwThreadID, dwCurrentThreadID: DWORD;
begin
// 檢查哪個(gè)窗體掌握光標(biāo)
GetCursorPos(pt);
hWindow := WindowFromPoint(pt);
// 獲得光標(biāo)所有者的線程ID
dwThreadID := GetWindowThreadProcessId(hWindow, nil);
// 獲得當(dāng)前線程的ID
dwCurrentThreadID := GetCurrentThreadId;
// 如果光標(biāo)所有者的線程不是當(dāng)前線程,就要把光標(biāo)所有者的線程配屬到當(dāng)前線程。
//然后調(diào)用GetCursor()來獲得正確的光標(biāo)句柄(hCursor)。
if (dwCurrentThreadID <> dwThreadID) then
begin
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
begin
// 獲得光標(biāo)句柄
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;
// 獲得光標(biāo)位置
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
// 在窗體上畫出光標(biāo)
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.Timer1Timer(Sender: TObject);
var
CI: TCursorInfo;
begin
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
end;
新聞熱點(diǎn)
疑難解答
圖片精選