Dziwne zachowanie zmienionego kursora myszy.

0

Witam.
Zmieniłem sobie wygląd kursora na ładowany z zasobów i z jednym drobiazgiem mam problem.
O ile uruchamiam program z poziomu IDE (F9, Emarcadero), kursor od razu jest taki jaki powinien być (zmieniony).
Za to gdy uruchamiam skompilowany plik wykonywalny, kursor zmienia się ze standardowego systemowego na nowy dopiero po poruszeniu myszą (jest od razu na powierzni właściwego okna). Tak jakby IDE jeszcze robiło coś więcej z aktywowaniem tego okna.

procedure TForm1.FormCreate(Sender: TObject);
begin
  Screen.Cursors[1] := LoadCursor(HInstance, 'CURSOR_1');
  Cursor := 1;
end;

W czym może leżeć problem? Co dopisać, żeby kursor był od razu zmieniony? Może w złym momencie to robię? Próbowałem sztucznie przesunąć jego położenie SetCursorPos(0, 0);, ale to nic nie daje.

Pozdro.

1

A próbowałeś w OnShow?
W dokumetancji (o ile dobrze rozumiem) https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setcursorpos

A window should move the cursor only when the cursor is in the window's client area.

czyli w OnCreate jeszcze nie masz tego okna więc nie ma jak przesuwać.

0

@Clarc: Niby logiczne, ale nie działa. Dodam, że ta sama funkcja dotycząca przesunięcia kursora myszy przeniesiona z OnCreate do OnShow formularza nie działa w ogóle (łatwo przetestować).
Zastanawiam się, czy nie powinienem w tym celu z jakichś powodów sięgać do obiektu Application.

0

A zrób testowo to inaczej - taka prowizorka/obejście: stwórz jakiegoś timera, ustaw go powiedzmy na 500ms, domyślnie ustaw go jako nieaktywny i odpal dopiero w OnShow. I niech ten timer ruszy myszką. Czy w takim wariancie działa?

1

A która to wersja Delphi? Sprawdzałem i działa przy OnCreate i OnShow jeśli kursor jest nad formatką bez dodatkowego kodu - tylko to co podane w pierwszym poście.

0

@Clarc: Ebarcadero 10.3.3. Mi uruchamiane z poziomu środowiska też działa OK, ale uruchamiane normalnie z execa zachowuje się tak jak napisałem.

0

Sprawdzałem exe-ka i przez IDE. A która wersja Windowsa? To VCL czy FMX? Sprawdzałeś na czystej formatce? To główna formatka czy jakiś Modal? Podesłałbym swój przykład do sprawdzenia ale skasowałem po sprawdzeniu :]

0

@Clarc: Windows 7. VCL. Czysta formatka. Główna. Też nie rozumiem ;)

1

No to kwestia 7-ki. Na 10-ce działa ok. Poleciłbym sprawdzić na wirtualce WIn10.
A z problemem zrobiłbym tak (pisane z palca):

procedure TForm1.FormCreate(Sender: TObject);
begin
  Screen.Cursors[1] := LoadCursor(HInstance, 'CURSOR_1');
  Cursor := 1;
end;

procedure TForm1.FormShow(Sender: TObject);
var
  P: TPoint;

begin
  GetCursorPos(P);
  SetCursorPos(P.X+1, P.Y);
end;
0

@Clarc: Na ten pomysł z +1 też wpadłem wcześniej :j, no ale na win7 nie działa (nie wiem czy to kwestia 7, czy może gdzieś w kodzie coś jeszcze trzeba zmienić). Pozdro.

1

A zwykłe ukrycie i pokazanie kursora?

ShowCursor(False);
ShowCursor(True);

0

@kAzek: Nic nie pomogło :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1