Wenn der Cursor von einem anderen Thread gesteuert wird, können Sie die Anwendungsschnittstelle GetCursor() nicht verwenden, um das Cursor-Handle abzurufen. In diesem Artikel wird erläutert, wie Sie ein Cursorhandle erhalten, wenn ein Thread die Kontrolle über den Cursor hat.
=============================================== =======
{
Wenn der Cursor von einem anderen Thread gesteuert wird, können Sie die Anwendungsschnittstelle GetCursor() nicht verwenden, um das Cursor-Handle abzurufen.
In diesem Artikel wird erläutert, wie Sie ein Cursorhandle erhalten, wenn ein Thread die Kontrolle über den Cursor hat.
Was ist beispielsweise zu tun, wenn Sie den Cursor in einem Bildschirmaufnahmeprogramm platzieren möchten?
}
Funktion GetCursorHandle: HCURSOR;
var
hWindow: HWND;
pt: TPoint;
pIconInfo: TIconInfo;
dwThreadID, dwCurrentThreadID: DWord;
beginnen
// Prüfen, welches Formular den Cursor hat
GetCursorPos(pt);
hWindow := WindowFromPoint(pt);
// Thread-ID des Cursorbesitzers abrufen
dwThreadID := GetWindowThreadPRocessId(hWindow, nil);
// Holen Sie sich die ID des aktuellen Threads
dwCurrentThreadID := GetCurrentThreadId;
// Wenn der Thread des Cursorbesitzers nicht der aktuelle Thread ist, muss der Thread des Cursorbesitzers dem aktuellen Thread zugewiesen werden.
//Dann rufen Sie GetCursor() auf, um das richtige Cursor-Handle (hCursor) zu erhalten.
if (dwCurrentThreadID <> dwThreadID) dann
beginnen
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) dann
beginnen
//Cursor-Handle abrufen
Ergebnis := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
Ende;
Ende sonst
beginnen
Ergebnis := GetCursor;
Ende;
Ende;
procedure TForm1.Button1Click(Sender: TObject);
var
CurPosX, CurPoxY: Ganzzahl;
Mein Cursor: TIcon;
pIconInfo: TIconInfo;
beginnen
MyCursor := TIcon.Create;
versuchen
MyCursor.Handle := GetCursorHandle;
// Cursorposition abrufen
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//Ziehen Sie den Cursor auf das Formular
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
Endlich
Wenn der Cursor von einem anderen Thread gesteuert wird, können Sie die Anwendungsschnittstelle GetCursor() nicht verwenden, um das Cursor-Handle abzurufen. In diesem Artikel wird erläutert, wie Sie ein Cursorhandle erhalten, wenn ein Thread die Kontrolle über den Cursor hat.
=============================================== =======
{
Wenn der Cursor von einem anderen Thread gesteuert wird, können Sie die Anwendungsschnittstelle GetCursor() nicht verwenden, um das Cursor-Handle abzurufen.
In diesem Artikel wird erläutert, wie Sie ein Cursorhandle erhalten, wenn ein Thread die Kontrolle über den Cursor hat.
Was ist beispielsweise zu tun, wenn Sie den Cursor in einem Bildschirmaufnahmeprogramm platzieren möchten?
}
Funktion GetCursorHandle: HCURSOR;
var
hWindow: HWND;
pt: TPoint;
pIconInfo: TIconInfo;
dwThreadID, dwCurrentThreadID: DWORD;
beginnen
// Prüfen, welches Formular den Cursor hat
GetCursorPos(pt);
hWindow := WindowFromPoint(pt);
// Thread-ID des Cursorbesitzers abrufen
dwThreadID := GetWindowThreadProcessId(hWindow, nil);
// Holen Sie sich die ID des aktuellen Threads
dwCurrentThreadID := GetCurrentThreadId;
// Wenn der Thread des Cursorbesitzers nicht der aktuelle Thread ist, muss der Thread des Cursorbesitzers dem aktuellen Thread zugewiesen werden.
//Dann rufen Sie GetCursor() auf, um das richtige Cursor-Handle (hCursor) zu erhalten.
if (dwCurrentThreadID <> dwThreadID) dann
beginnen
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) dann
beginnen
//Cursor-Handle abrufen
Ergebnis := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
Ende;
Ende sonst
beginnen
Ergebnis := GetCursor;
Ende;
Ende;
procedure TForm1.Button1Click(Sender: TObject);
var
CurPosX, CurPoxY: Ganzzahl;
Mein Cursor: TIcon;
pIconInfo: TIconInfo;
beginnen
MyCursor := TIcon.Create;
versuchen
MyCursor.Handle := GetCursorHandle;
// Cursorposition abrufen
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//Ziehen Sie den Cursor auf das Formular
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
Endlich
MyCursor.ReleaseHandle;
MyCursor.Free;
Ende;
Ende;
//Eine andere Lösung:
procedure TForm1.Timer1Timer(Sender: TObject);
var
CI:TCursorInfo;
beginnen
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
Ende;
MyCursor.ReleaseHandle;
MyCursor.Free;
Ende;
Ende;
//Eine andere Lösung:
procedure TForm1.Timer1Timer(Sender: TObject);
var
CI:TCursorInfo;
beginnen
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
Ende;