Здравствуйте, LuciferNovoros, Вы писали:
LN>Здравствуйте, BlackEric, Вы писали:
BE>>На любом 2012 или только на одном? Может там что-то установлено что его держит? ClassicShell какой-нибудь?
LN>Вряд ли. Проверил на своем WinSrv 2012R2 с установленным ClassicShell.
LN>Lasarus 1.8.4, FPC 3.1, x64 — полет нормальный. Все курсоры четко возвращаются. ИМХО, ошибка где-то на уровне более глубоком.
Проверьте, чтобы текущий десктоп был активным OpenInputDesktop, GetThreadDesktop, SetThreadDesktop
Так же можно получить хендл курсора функцией GetCursor
Есть еще способ. Там нужно присоединяться к активному потоку:
function TCursorInfoThread.GetCursorInfoWithAttach: TCursorInfo;
var
hWindow: HWND;
pt: TPoint;
dwThreadID, dwCurrentThreadID: DWORD;
begin
Result.hCursor := 0;
ZeroMemory(@Result, SizeOf(Result));
Result.cbSize := SizeOf(TCursorInfo);
// Find out which window owns the cursor
if GetCursorPos(pt) then
begin
Result.ptScreenPos := pt;
hWindow := WindowFromPoint(pt);
if IsWindow(hWindow) then
begin
// Get the thread ID for the cursor owner.
dwThreadID := GetWindowThreadProcessId(hWindow, nil);
// Get the thread ID for the current thread
dwCurrentThreadID := GetCurrentThreadId;
// If the cursor owner is not us then we must attach to
// the other thread in so that we can use GetCursor() to
// return the correct hCursor
if (dwCurrentThreadID <> dwThreadID) then
begin
if AttachThreadInput(dwCurrentThreadID, dwThreadID, True) then
begin
// Get the handle to the cursor
Result.hCursor := GetCursor;
AttachThreadInput(dwCurrentThreadID, dwThreadID, False);
end;
end
else
begin
Result.hCursor := GetCursor;
end;
end;
end;
end;