Lorsque le curseur est contrôlé par un autre thread, vous ne pouvez pas utiliser l'interface d'application GetCursor() pour obtenir le handle du curseur. Cet article explique comment obtenir un handle de curseur lorsqu’un thread contrôle le curseur.
=================================================== =======
{
Lorsque le curseur est contrôlé par un autre thread, vous ne pouvez pas utiliser l'interface d'application GetCursor() pour obtenir le handle du curseur.
Cet article explique comment obtenir un handle de curseur lorsqu’un thread contrôle le curseur.
Par exemple, que faire lorsque vous souhaitez placer le curseur dans un programme de capture d'écran.
}
fonction GetCursorHandle : HCURSOR ;
var
hFenêtre : HWND ;
point : TPoint ;
pIconInfo : TIconInfo ;
dwThreadID, dwCurrentThreadID : DWord ;
commencer
// Vérifiez quel formulaire contient le curseur
GetCursorPos(pt);
hFenêtre := WindowFromPoint(pt);
// Récupère l'ID du thread du propriétaire du curseur
dwThreadID := GetWindowThreadPRocessId(hWindow, nul);
// Récupère l'ID du thread actuel
dwCurrentThreadID := GetCurrentThreadId;
// Si le thread du propriétaire du curseur n'est pas le thread actuel, le thread du propriétaire du curseur doit être affecté au thread actuel.
//Appelez ensuite GetCursor() pour obtenir le bon handle de curseur (hCursor).
si (dwCurrentThreadID <> dwThreadID) alors
commencer
si AttachThreadInput (dwCurrentThreadID, dwThreadID, True) alors
commencer
//Obtenir le handle du curseur
Résultat := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
fin;
fin sinon
commencer
Résultat := GetCursor;
fin;
fin;
procédure TForm1.Button1Click(Expéditeur : TObject);
var
CurPosX, CurPoxY : entier ;
MonCurseur : TIcon ;
pIconInfo : TIconInfo ;
commencer
MonCurseur := TIcon.Create;
essayer
MonCursor.Handle := GetCursorHandle;
// Récupère la position du curseur
GetIconInfo(MonCurseur.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//Dessine le curseur sur le formulaire
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
enfin
Lorsque le curseur est contrôlé par un autre thread, vous ne pouvez pas utiliser l'interface d'application GetCursor() pour obtenir le handle du curseur. Cet article explique comment obtenir un handle de curseur lorsqu’un thread contrôle le curseur.
=================================================== =======
{
Lorsque le curseur est contrôlé par un autre thread, vous ne pouvez pas utiliser l'interface d'application GetCursor() pour obtenir le handle du curseur.
Cet article explique comment obtenir un handle de curseur lorsqu’un thread contrôle le curseur.
Par exemple, que faire lorsque vous souhaitez placer le curseur dans un programme de capture d'écran.
}
fonction GetCursorHandle : HCURSOR ;
var
hFenêtre : HWND ;
point : TPoint ;
pIconInfo : TIconInfo ;
dwThreadID, dwCurrentThreadID : DWORD ;
commencer
// Vérifiez quel formulaire contient le curseur
GetCursorPos(pt);
hFenêtre := WindowFromPoint(pt);
// Récupère l'ID du thread du propriétaire du curseur
dwThreadID := GetWindowThreadProcessId(hWindow, nul);
// Récupère l'ID du thread actuel
dwCurrentThreadID := GetCurrentThreadId;
// Si le thread du propriétaire du curseur n'est pas le thread actuel, le thread du propriétaire du curseur doit être affecté au thread actuel.
//Appelez ensuite GetCursor() pour obtenir le bon handle de curseur (hCursor).
si (dwCurrentThreadID <> dwThreadID) alors
commencer
si AttachThreadInput (dwCurrentThreadID, dwThreadID, True) alors
commencer
//Obtenir le handle du curseur
Résultat := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
fin;
fin sinon
commencer
Résultat := GetCursor;
fin;
fin;
procédure TForm1.Button1Click(Expéditeur : TObject);
var
CurPosX, CurPoxY : entier ;
MonCurseur : TIcon ;
pIconInfo : TIconInfo ;
commencer
MonCurseur := TIcon.Create;
essayer
MonCursor.Handle := GetCursorHandle;
// Récupère la position du curseur
GetIconInfo(MonCurseur.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//Dessine le curseur sur le formulaire
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
enfin
MyCursor.ReleaseHandle ;
MonCurseur.Gratuit ;
fin;
fin;
//Autre solution :
procédure TForm1.Timer1Timer(Expéditeur : TObject);
var
CI:TCursorInfo;
commencer
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
fin;
MyCursor.ReleaseHandle ;
MonCurseur.Gratuit ;
fin;
fin;
//Autre solution :
procédure TForm1.Timer1Timer(Expéditeur : TObject);
var
CI:TCursorInfo;
commencer
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Image1.Picture.Icon.Handle := CI.hCursor;
fin;