Quando o cursor é controlado por outro thread, você não pode usar a interface do aplicativo GetCursor() para obter o identificador do cursor. Este artigo explica como obter um identificador de cursor quando qualquer thread tem o controle do cursor.
================================================= =======
{
Quando o cursor é controlado por outro thread, você não pode usar a interface do aplicativo GetCursor() para obter o identificador do cursor.
Este artigo explica como obter um identificador de cursor quando qualquer thread tem o controle do cursor.
Por exemplo, o que fazer quando você deseja colocar o cursor em um programa de captura de tela.
}
função GetCursorHandle: HCURSOR;
var
hJanela: HWND;
pt: TPonto;
pIconInfo: TIconInfo;
dwThreadID, dwCurrentThreadID: DWord;
começar
// Verifica qual formulário possui o cursor
GetCursorPos(pt);
hJanela := JanelaFromPoint(pt);
// Obtém o ID do thread do proprietário do cursor
dwThreadID := GetWindowThreadPRocessId(hWindow, nil);
// Obtém o ID do thread atual
dwCurrentThreadID := GetCurrentThreadId;
// Se o thread do proprietário do cursor não for o thread atual, o thread do proprietário do cursor deverá ser atribuído ao thread atual.
//Em seguida, chame GetCursor() para obter o identificador correto do cursor (hCursor).
se (dwCurrentThreadID <> dwThreadID) então
começar
se AttachThreadInput(dwCurrentThreadID, dwThreadID, True) então
começar
//Obtém o identificador do cursor
Resultado := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
fim;
fim mais
começar
Resultado := GetCursor;
fim;
fim;
procedimento TForm1.Button1Click(Remetente: TObject);
var
CurPosX, CurPoxY: Inteiro;
MeuCursor: TIcon;
pIconInfo: TIconInfo;
começar
MeuCursor := TIcon.Create;
tentar
MeuCursor.Handle := GetCursorHandle;
// Obtém a posição do cursor
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//Desenha o cursor no formulário
Canvas.Draw(CurPoxY, CurPoxY, MeuCursor);
finalmente
Quando o cursor é controlado por outro thread, você não pode usar a interface do aplicativo GetCursor() para obter o identificador do cursor. Este artigo explica como obter um identificador de cursor quando qualquer thread tem o controle do cursor.
================================================= =======
{
Quando o cursor é controlado por outro thread, você não pode usar a interface do aplicativo GetCursor() para obter o identificador do cursor.
Este artigo explica como obter um identificador de cursor quando qualquer thread tem o controle do cursor.
Por exemplo, o que fazer quando você deseja colocar o cursor em um programa de captura de tela.
}
função GetCursorHandle: HCURSOR;
var
hJanela: HWND;
pt: TPonto;
pIconInfo: TIconInfo;
dwThreadID, dwCurrentThreadID: DWORD;
começar
// Verifica qual formulário possui o cursor
GetCursorPos(pt);
hJanela := JanelaFromPoint(pt);
// Obtém o ID do thread do proprietário do cursor
dwThreadID := GetWindowThreadProcessId(hWindow, nil);
// Obtém o ID do thread atual
dwCurrentThreadID := GetCurrentThreadId;
// Se o thread do proprietário do cursor não for o thread atual, o thread do proprietário do cursor deverá ser atribuído ao thread atual.
//Em seguida, chame GetCursor() para obter o identificador correto do cursor (hCursor).
se (dwCurrentThreadID <> dwThreadID) então
começar
se AttachThreadInput(dwCurrentThreadID, dwThreadID, True) então
começar
//Obtém o identificador do cursor
Resultado := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
fim;
fim mais
começar
Resultado := GetCursor;
fim;
fim;
procedimento TForm1.Button1Click(Remetente: TObject);
var
CurPosX, CurPoxY: Inteiro;
MeuCursor: TIcon;
pIconInfo: TIconInfo;
começar
MeuCursor := TIcon.Create;
tentar
MeuCursor.Handle := GetCursorHandle;
// Obtém a posição do cursor
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//Desenha o cursor no formulário
Canvas.Draw(CurPoxY, CurPoxY, MeuCursor);
finalmente
MeuCursor.ReleaseHandle;
MeuCursor.Free;
fim;
fim;
//Outra solução:
procedimento TForm1.Timer1Timer(Remetente: TObject);
var
CI:TCursorInfo;
começar
CI.cbSize := TamanhoOf(CI);
GetCursorInfo(CI);
Imagem1.Picture.Icon.Handle := CI.hCursor;
fim;
MeuCursor.ReleaseHandle;
MeuCursor.Free;
fim;
fim;
//Outra solução:
procedimento TForm1.Timer1Timer(Remetente: TObject);
var
CI:TCursorInfo;
começar
CI.cbSize := TamanhoOf(CI);
GetCursorInfo(CI);
Imagem1.Picture.Icon.Handle := CI.hCursor;
fim;