Oficjalne forum komunikatora AQQ: [Delphi] Wysuwa na wierzch tylko przed okna aqq - Oficjalne forum komunikatora AQQ

Skocz do zawartości

Strona 1 z 1
  • Nie możesz napisać tematu
  • Nie możesz odpowiedzieć

[Delphi] Wysuwa na wierzch tylko przed okna aqq

#1 Użytkownik nie jest zalogowany   matiss 

  • Expert
  • Grupa Wtyczkopisarz
  • Postów 830
  • Zgłoszeń 30 (Postów 169)
  • Rejestracja 30.08.2008
  • Jabbermatiss@aqq.eu matiss@aqq.eu

Napisano 28.12.2009 14:42.

Witam, może to głupie pytanie ale mam pewien problem, otóż gdy używam komendy form1.BringToFront; wysuwa mi formatkę na wierzch ale tylko przed okna AQQ a już okna innych aplikacji ignoruje, czyli jeśli na wierzchu mamy firefoxa to nie damy rady wywołać naszej formatki przed to okno. Błąd jest chyba stąd że okno wtyczki jest podpięte pod okno aqq, da się to jakoś zmienić ? Dotychczas bawiłem się z GetForegroundWindow i SetForegroundWindow ale to nie jest idealna metoda ponieważ w pewnych sytuacjach wywołuje nam okno innej aplikacji na wierzch :/
Dołączona grafika
System, AQQ, Kompozycja, Wtyczki
0


Strona 1 z 1
  • Nie możesz napisać tematu
  • Nie możesz odpowiedzieć

Odpowiedzi do tego tematu

#2 Użytkownik nie jest zalogowany   Dibo 

  • Bywalec
  • Grupa Wtyczkopisarz
  • Postów 184
  • Zgłoszeń 7 (Postów 44)
  • Rejestracja 02.09.2008

Napisano 28.12.2009 14:56.

Dziwne, SetForegroundWindow powinno wyrzucić na wierzch twoje okno. Na pewno posyłasz właściwy wskaźnik okna? SetForegroundWindow(From1.Handle).
Innym mało estetycznym rozwiązaniem może być włączenie na chwilę StayOnTop :P

Edit: A spróbuj jeszcze przed SetForegroundWindow wywołać: BringWindowToTop(Form1.Handle);
0

#3 Użytkownik nie jest zalogowany   Beherit 

  • Chaos Warrior
  • Grupa Wtyczkopisarz
  • Postów 1386
  • Zgłoszeń 76 (Postów 644)
  • Rejestracja 30.08.2008
  • Jabberbeherit@aqq.eu beherit@aqq.eu
  • MiejscowośćPoznań

Napisano 28.12.2009 15:10.

Użyj SetWindowPos ;)
Spoiler

Dołączona grafika
0

#4 Użytkownik nie jest zalogowany   matiss 

  • Expert
  • Grupa Wtyczkopisarz
  • Postów 830
  • Zgłoszeń 30 (Postów 169)
  • Rejestracja 30.08.2008
  • Jabbermatiss@aqq.eu matiss@aqq.eu

Napisano 28.12.2009 21:34.

Aj namieszałem w poście SetForegroundWindow działa ale później przy zamykaniu okienka wtyczki muszę oddać focus czy jak to nazwać odpowiedniemu oknu bez tego wyrzuca nam okno aqq na pierwszy plan, i radziłem sobie poprzez to, że przed wywołaniem wtyczki na wierzch brałem handle okienka które było na wierzchu i przy zamykaniu okna wtyczki przywracałem mu ten handle, jednakże są pewne sytuacje w których ten zwrotny handle wywołuje na wierzch okno które nie jest bezpośrednio pod oknem wtyczki, ale między nimi jest coś jeszcze. Mam nadzieję że nie namotałem zbyt bardzo.

StayOnTop tez odpada gdyż nie do końca działa, tzn ok wywołuje na wierz ale po kliknięciu na aplikację znajdującą się tuż pod oknem wtyczki nie wywołuje tej że na wierzch (tak jakby wtyczka dalej byłą "zawsze na wierzchu") dopiero klikniecie na okno będące niżej działa normalnie. W sumie nie wiem czemu tak się dzieje, ale wiem że też próbowałem tą metodą i właśnie nie działało.

SetWindowsPos też próbowałem efekt taki sam jak z stayontop, no chyba że coś źle robię:
SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,0);
    SetWindowPos(Handle,HWND_NOTOPMOST,Left,Top,Width,Height,0);
Dołączona grafika
System, AQQ, Kompozycja, Wtyczki
0

#5 Użytkownik nie jest zalogowany   Dibo 

  • Bywalec
  • Grupa Wtyczkopisarz
  • Postów 184
  • Zgłoszeń 7 (Postów 44)
  • Rejestracja 02.09.2008

Napisano 28.12.2009 23:19.

Aaaa, wydaje mi się że podobny problem sam Oconnel miał kiedyś z okienkami :P. To chyba jakaś wada delphioskich okienek...
0

#6 Użytkownik nie jest zalogowany   Beherit 

  • Chaos Warrior
  • Grupa Wtyczkopisarz
  • Postów 1386
  • Zgłoszeń 76 (Postów 644)
  • Rejestracja 30.08.2008
  • Jabberbeherit@aqq.eu beherit@aqq.eu
  • MiejscowośćPoznań

Napisano 29.12.2009 00:23.

@matiss Po pierwsze to w ustawieniach formy w kompilatorze można ustawić aby okno było domyślnie na wierzchu. Po drugie SetWindowPos używa się nieco inaczej, poniżej masz kod:
SetWindowPos(
Handle, //uchwyt do formy lub do całej aplikacji - po prostu po testuj
HWND_TOPMOST, //lub HWND_NOTOPMOST
0, //te dane są niepotrzebne więc można dać wszędzie zero
0,
0,
0,
SWP_NOMOVE | SWP_NOSIZE //no i to jest najważniejsze, żeby nie zmieniło rozmiaru i pozycji okna
//można jeszcze dodać SWP_SHOWWINDOW aczkolwiek jest to raczej nie potrzebne
);
Spoiler

Dołączona grafika
0

#7 Użytkownik nie jest zalogowany   Arthemis 

  • Początkujący
  • Grupa Wtyczkopisarz
  • Postów 38
  • Zgłoszeń 3 (Postów 59)
  • Rejestracja 01.09.2009
  • Jabberartemis@aqq.eu artemis@aqq.eu

Napisano 29.12.2009 02:40.

Możesz też spróbować przy tworzeniu formatki jako Owner przekazać uchwyt pulpitu - wtedy BringToFront() powinno wysuwać okno przed wszystkie inne.
0

#8 Użytkownik nie jest zalogowany   matiss 

  • Expert
  • Grupa Wtyczkopisarz
  • Postów 830
  • Zgłoszeń 30 (Postów 169)
  • Rejestracja 30.08.2008
  • Jabbermatiss@aqq.eu matiss@aqq.eu

Napisano 29.12.2009 14:05.

@Beherit
Wiem że można ustawić, ale ja nie chcę aby okno było cały czas na wierzchu tylko skrótem klawiszowym aby można je było na wierzch przesunąć. Poza tym nie widzę zbyt wielkiej różnicy w tym SetWindowPos, poza zerami zamiast left top itd. ale te dane raczej nie wpływają na zachowanie.

@Arthemis
O właśnie o czymś takim myślałem, tylko nie wiem jak to zrobić na necie znalazłem, że jak chcemy żeby desktop był to dajemy nil ale mam tak od początku form1 := Tform1.Create(nil); i nie działa.
Dołączona grafika
System, AQQ, Kompozycja, Wtyczki
0

#9 Użytkownik nie jest zalogowany   Arthemis 

  • Początkujący
  • Grupa Wtyczkopisarz
  • Postów 38
  • Zgłoszeń 3 (Postów 59)
  • Rejestracja 01.09.2009
  • Jabberartemis@aqq.eu artemis@aqq.eu

Napisano 29.12.2009 14:30.

A spróbuj TFrom.Create( PComponent(GetDesktopWindow()) );

Jeśli wyskoczy Ci brak typu PComponent to zadeklaruj go sobie na górze *.pas'a
type PComponent = ^TComponent;
0

#10 Użytkownik nie jest zalogowany   matiss 

  • Expert
  • Grupa Wtyczkopisarz
  • Postów 830
  • Zgłoszeń 30 (Postów 169)
  • Rejestracja 30.08.2008
  • Jabbermatiss@aqq.eu matiss@aqq.eu

Napisano 29.12.2009 15:46.

Kombinuję kombinuję i nie umiem, nie bawiłem się wcześniej z type więc może moje pytania wydadzą się banalne ale cóż. Zadeklarowałem wskaźnik w type ale wyrzuca mi błąd że typy się nie zgadzają (przy form create)
Incompatible types: 'TComponent' and 'PComponent'


Gdy zmieniłem tamta linijkę na taką bez wskaźnika:
Tform1.Create(TComponent( GetDesktopWindow() ));

To co prawda wtyczka się skompilowała ale po prostu nie działa, aqq ją ładuje i nic nawet błędu nie wyrzuca. Spróbuję jeszcze coś pogrzebać ale jeśli wiecie co jest nie tak będę wdzięczny :)
Dołączona grafika
System, AQQ, Kompozycja, Wtyczki
0

#11 Użytkownik nie jest zalogowany   Arthemis 

  • Początkujący
  • Grupa Wtyczkopisarz
  • Postów 38
  • Zgłoszeń 3 (Postów 59)
  • Rejestracja 01.09.2009
  • Jabberartemis@aqq.eu artemis@aqq.eu

Napisano 29.12.2009 16:13.

Możesz też spróbować użyć
TForm.CreateParented(GetDesktopWindow());
0

#12 Użytkownik nie jest zalogowany   matiss 

  • Expert
  • Grupa Wtyczkopisarz
  • Postów 830
  • Zgłoszeń 30 (Postów 169)
  • Rejestracja 30.08.2008
  • Jabbermatiss@aqq.eu matiss@aqq.eu

Napisano 29.12.2009 17:22.

Teraz się kompiluje, ale efekt jest taki sam jak przy crate(nil) tzn. okienko wychodzi na wierzch ale tylko przed okna AQQ.
Dołączona grafika
System, AQQ, Kompozycja, Wtyczki
0

#13 Użytkownik nie jest zalogowany   UsagiAddict 

  • J̵ava͡Pr͝òg̢ram̵mer
  • Grupa Użytkownik
  • Postów 905
  • Zgłoszeń 40 (Postów 355)
  • Rejestracja 22.05.2009
  • Jabberusagiaddict@aqq.eu usagiaddict@aqq.eu

Napisano 29.12.2009 18:01.

A można użyć kodu natywnego? Dodatkowo coś w C/C++ lub Asemblerze jakimś napisać i dołączyć? Skoro AQQ jest stricte windowsowskie to na przenośność kodu to nie wpłynie.
Dołączona grafika
0

#14 Użytkownik nie jest zalogowany   Morpheus 

  • Weteran
  • Grupa Wtyczkopisarz
  • Postów 576
  • Zgłoszeń 12 (Postów 68)
  • Rejestracja 21.11.2008

Napisano 03.01.2010 19:23.

Wyświetl postUżytkownik UsagiAddict dnia 29.12.2009 18:01 napisał

A można użyć kodu natywnego? Dodatkowo coś w C/C++ lub Asemblerze jakimś napisać i dołączyć? Skoro AQQ jest stricte windowsowskie to na przenośność kodu to nie wpłynie.

A Delphi to nie kod natywny ? ;P
Zresztą jaki cel miałoby dołączanie C/C++, który ma praktycznie takie same możliwości po to, żeby użyc funkcji VCLa który jest biblioteką dla Delphi?
Dołączona grafika
0

#15 Użytkownik nie jest zalogowany   UsagiAddict 

  • J̵ava͡Pr͝òg̢ram̵mer
  • Grupa Użytkownik
  • Postów 905
  • Zgłoszeń 40 (Postów 355)
  • Rejestracja 22.05.2009
  • Jabberusagiaddict@aqq.eu usagiaddict@aqq.eu

Napisano 05.01.2010 22:41.

pomyślałem, że jeśli nie można w Dephi to w innym języku będzie taka możliwość ; ) chyba że windows jest tak skonstruowany, że nie można
Dołączona grafika
0

#16 Użytkownik nie jest zalogowany   matiss 

  • Expert
  • Grupa Wtyczkopisarz
  • Postów 830
  • Zgłoszeń 30 (Postów 169)
  • Rejestracja 30.08.2008
  • Jabbermatiss@aqq.eu matiss@aqq.eu

Napisano 30.01.2010 14:06.

Ok postanowiłem dalej się z tym pomęczyć i doszedłem do tego co jest nie tak, funkcja setwindowpos nie daje okienku focusa używam takiego kodu

Cytat

SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE);

SetWindowPos(Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE);

I wszystko fajnie wychodzi na wierzch, ale focus ma dalej okienko pod wtyczką, dodawałem linijki typu Form1.setfocus; ale o dziwo to też nie nadaje wtyczce focusa, bawię się tym dalej ale jakbyście mieli jakiś pomysł to byłbym wdzięczny :)
Dołączona grafika
System, AQQ, Kompozycja, Wtyczki
0

Udostępnij ten temat:


Strona 1 z 1
  • Nie możesz napisać tematu
  • Nie możesz odpowiedzieć

Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych