Когда курсор управляется другим потоком, вы не можете использовать интерфейс приложения GetCursor() для получения дескриптора курсора. В этой статье объясняется, как получить дескриптор курсора, когда любой поток контролирует курсор.
=============================================== =======
{
Когда курсор управляется другим потоком, вы не можете использовать интерфейс приложения GetCursor() для получения дескриптора курсора.
В этой статье объясняется, как получить дескриптор курсора, когда любой поток контролирует курсор.
Например, что делать, если вы хотите поместить курсор в программу захвата экрана.
}
функция GetCursorHandle: HCURSOR;
вар
hОкно: HWND;
точка: TPoint;
пиконинфо: ТИконинфо;
dwThreadID, dwCurrentThreadID: DWord;
начинать
// Проверяем, в какой форме находится курсор
GetCursorPos (пт);
hWindow:= WindowFromPoint(pt);
// Получаем идентификатор потока владельца курсора
dwThreadID: = GetWindowThreadPROcessId (hWindow, ноль);
// Получаем идентификатор текущего потока
dwCurrentThreadID: = GetCurrentThreadId;
// Если поток владельца курсора не является текущим потоком, поток владельца курсора должен быть назначен текущему потоку.
//Затем вызываем GetCursor(), чтобы получить правильный дескриптор курсора (hCursor).
если (dwCurrentThreadID <> dwThreadID), то
начинать
если AttachThreadInput(dwCurrentThreadID, dwThreadID, True), то
начинать
//Получаем хэндл курсора
Результат: = GetCursor;
AttachThreadInput (dwCurrentThreadID, dwThreadID, False);
конец;
закончить еще
начинать
Результат: = GetCursor;
конец;
конец;
процедура TForm1.Button1Click(Отправитель: TObject);
вар
CurPosX, CurPoxY: целое число;
МойКурсор: TIcon;
пиконинфо: ТИконинфо;
начинать
МойКурсор := TIcon.Create;
пытаться
MyCursor.Handle := GetCursorHandle;
// Получаем позицию курсора
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//Рисуем курсор на форме
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
окончательно
Когда курсор управляется другим потоком, вы не можете использовать интерфейс приложения GetCursor() для получения дескриптора курсора. В этой статье объясняется, как получить дескриптор курсора, когда курсор контролируется каким-либо потоком.
=============================================== =======
{
Когда курсор управляется другим потоком, вы не можете использовать интерфейс приложения GetCursor() для получения дескриптора курсора.
В этой статье объясняется, как получить дескриптор курсора, когда любой поток контролирует курсор.
Например, что делать, если вы хотите поместить курсор в программу захвата экрана.
}
функция GetCursorHandle: HCURSOR;
вар
hОкно: HWND;
точка: TPoint;
пиконинфо: ТИконинфо;
dwThreadID, dwCurrentThreadID: DWORD;
начинать
// Проверяем, в какой форме находится курсор
GetCursorPos (пт);
hWindow:= WindowFromPoint(pt);
// Получаем идентификатор потока владельца курсора
dwThreadID: = GetWindowThreadProcessId (hWindow, ноль);
// Получаем идентификатор текущего потока
dwCurrentThreadID: = GetCurrentThreadId;
// Если поток владельца курсора не является текущим потоком, поток владельца курсора должен быть назначен текущему потоку.
//Затем вызываем GetCursor(), чтобы получить правильный дескриптор курсора (hCursor).
если (dwCurrentThreadID <> dwThreadID), то
начинать
если AttachThreadInput(dwCurrentThreadID, dwThreadID, True), то
начинать
//Получаем дескриптор курсора
Результат: = GetCursor;
AttachThreadInput (dwCurrentThreadID, dwThreadID, False);
конец;
закончить еще
начинать
Результат: = GetCursor;
конец;
конец;
процедура TForm1.Button1Click(Отправитель: TObject);
вар
CurPosX, CurPoxY: целое число;
МойКурсор: TIcon;
пиконинфо: ТИконинфо;
начинать
МойКурсор := TIcon.Create;
пытаться
MyCursor.Handle := GetCursorHandle;
// Получаем позицию курсора
GetIconInfo(MyCursor.Handle, pIconInfo);
CurPosX := pIconInfo.xHotspot;
CurPoxY := pIconInfo.yHotspot;
//Рисуем курсор на форме
Canvas.Draw(CurPoxY, CurPoxY, MyCursor);
окончательно
МойКурсор.ReleaseHandle;
МойКурсор.Бесплатно;
конец;
конец;
//Другое решение:
процедура TForm1.Timer1Timer(Отправитель: TObject);
вар
CI:TCursorInfo;
начинать
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Изображение1.Картинка.Значок.Хандле := CI.hCursor;
конец;
МойКурсор.ReleaseHandle;
МойКурсор.Бесплатно;
конец;
конец;
//Другое решение:
процедура TForm1.Timer1Timer(Отправитель: TObject);
вар
CI:TCursorInfo;
начинать
CI.cbSize := SizeOf(CI);
GetCursorInfo(CI);
Изображение1.Картинка.Значок.Хандле := CI.hCursor;
конец;