Re[3]: Получить хендл курсора
От: xteam777  
Дата: 03.03.19 16:56
Оценка:
Здравствуйте, 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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.