przywracanie zminimalizowanego okienka

0

Uzywam w swoim programie systemowej klawiatury ekranowej:

ShellExecute(Okno, 'open', 'osk.exe', nil, nil, SW_SHOWMAXIMIZED);

no ale czasem sie zdarzy ze uzytkownik zminimalizuje klawiature,
a ze w czasie dzialania programu nie jest dostepny pasek zadan,
nie ma juz mozliwosci przywrocenia jej z powrotem.

Chcialbym zeby byl przycisk ktory dzialalby w taki sposob, ze po pierwszym
nacisnieciu uruchamialby klawiature a po nastepnym, jesli byla ona zminimalizowana,
przywracal ja na ekran.

napisalem wiec taka procedure:

procedure MojaProcedura(Sender: TObject);
var s: pchar;
    okno: THandle;
begin
  Okno := 0;
  s:=pchar('Klawiatura ekranowa');
  Okno := FindWindow(NIL,s);
  if (Okno<>0) then
    ShowWindow(Okno,SW_RESTORE+SW_SHOWMAXIMIZED)
  else
    ShellExecute(Okno, 'open', 'osk.exe', nil, nil, SW_SHOWMAXIMIZED);
  BringWindowToTop(Okno);
  pnlMenu.SendToBack;
end;

probowalem tez takiego czegos, zeby w przypadku znalezienia okna zamykac je

CloseWindow(okno);

a potem otwierac na nowo,
ale jak mozecie sie domyslac z obecnosci tego watku,
zadna z tych metod nie zadzialala:/

Czy mozecie poradzic jakies sensowne rozwiazanie?

0
procedure MojaProcedura(Sender: TObject);

var s: pchar;
    okno: THandle;
begin
  Okno := 0;
  s:=pchar('OSKMainClass');
  Okno := FindWindow(s,NIL);
  if (Okno<>0) then
  begin
    ShowWindow(Okno,SW_RESTORE);
 //   ShowWindow(Okno,SW_SHOWMAXIMIZED);//   po co to ?
    end
  else
    ShellExecute(Okno, 'open', 'osk.exe', nil, nil, SW_SHOWMAXIMIZED);
  begin
  BringWindowToTop(Okno);
  end;

end;
end.

teraz jest ok szukam po klasie bo w różnych wersjach językowych caption może być różny .
znalazłem jedną wkurzającą przypadłość po maxymalizacji to okno jest paskudne cały czas
na ful screen .
Należało by jescze zrobić SetWindowRgn() i nadawać sensowny rozmiar .

0

dzieki wszystko gra!
Nie zauwazylem u siebie zadnych problemow z rozmiarami okienka...

Z kad wziales nazwe klasy okienka?
Jest moze jakies miejsce gdzie sa napisane nazwy klas okienek systemowych?
czy to po prostu sie wie ;-) ?

0
Johny_Morfina napisał(a)

Z kad wziales nazwe klasy okienka?
Jest moze jakies miejsce gdzie sa napisane nazwy klas okienek systemowych?
czy to po prostu sie wie ;-) ?

Najprościej umieścić na Formie Timer z niskim Interval'em i dwa Labele,
dać oknu formatki własność FormStyle na fsStayOnTop i dodać taki kod:

procedure TMainForm.Timer1Timer(Sender: TObject);
var
rPos: TPoint;
begin
if Boolean(GetCursorPos(rPos)) then ShowHwndAndClassName(rPos);
end;

procedure TMainForm.ShowHwndAndClassName(CrPos: TPoint);
var
hWnd: THandle;
aName: array [0..255] of Char;
begin
hWnd := WindowFromPoint(CrPos);
Label1.Caption := 'Handle :' + IntToStr(hWnd);

if Boolean(GetClassName(hWnd, aName, 256)) then
Label2.Caption := 'ClassName : ' + string(aName)
else
Label2.Caption := 'ClassName : not found';
end;

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