System tray (delphi)

System tray (delphi)
2013-05-09T16:40:24+02:00
2013-05-11T16:02:50+02:00
2022-10-15T22:26:21+02:00
azxo1
Hello mindenkinek!
Az lenne a kérdésem, hogy egy system tray-ben levő
alkalmazásnak hogyan kell olyan üzenetet küldeni, hogy az teljes képernyős legyen.
Konkrétan arról lenne szó, hogy a windows xp indulásakor indul a Skype is, de system tray-ben marad.
Azt szeretném elérni, hogy delphiből küldök a Skype-nak egy windowsmessage-t, hogy teljes képernyős legyen. Csak nem tudom mit kell. (message üzenetekkel nincs gond, tudom hogy kell, csak azt nem, hogy itt konkrétan mit). Gondoltam mouse_event-re is, de ez azért nem jó, mert nem biztos, hogy a Skype mindig ugyanott lesz a systemtray-ben.
Szóval systemtray-ben levő Skype-nak "teljesképernyős" windowsmessage küldése Delphiből.
Ez lenne a kérdésem.
Hozzászólásokat előre is köszönöm.
(ha valahol nem fogalmaztam jól, akkor bocsi a tudatlanságomlért)

Esetleg hogyan lehet lekérdezni, hogy milyen üzenet hajtódik végre, amikor a systemtayben levő Skype-ra duplán kattintok?
Mutasd a teljes hozzászólást!
ennyit vagyok hajlandó tenni az ügy érdekében:
var hwndSkype: HWND; hwndSkype := FindWindow('tSkMainForm', nil); if hwndSkype <> 0 then begin ShowWindow(hwndSkype, SW_SHOWMAXIMIZED); end;

Ennek csak annyi a mellékhatása, hogy nem zárható be utána az ablak, csak akkor, ha ügyködünk rajta valamit.
Mutasd a teljes hozzászólást!

  • Azt az adott alkalmazás definiálja, hogy mi történik a system tray-ben lévő ikonon való kattintásra, ez nem egy sztenderd windows üzenet eredménye. Tehát annyit tehetsz, hogy megkeresed a tray-en a skype ikonját és küldesz neki postmessage/sendmessage segítségével (mouse_event már régen deprecated, már csak kompatibilitási okokból támogatja a winapi) küldesz az ikonnak kattintást.
    Mutasd a teljes hozzászólást!
  • Hát pont ez az, hogy nem tudom mit küldjek neki.
    Na meg hogyan is keresem meg?
    Mutasd a teljes hozzászólást!
  • Hát pont ez az, hogy nem tudom mit küldjek neki.


    Egérkattintást

    Na meg hogyan is keresem meg?


    A látható iconocat a windwindowex winapi függvénnyel keresheted meg, itt találsz hozzá c++-os mintát, ezt kell átültetned delphi-re. Ha megvan a skype handle-je, akkor annak mehet az egérkattintás küldése.
    Mutasd a teljes hozzászólást!
  • Oké.
    Find system tray megvan:


    function TaskbarHandle: THandle; begin Result := FindWindow('Shell_TrayWnd', nil); end;
    Mutasd a teljes hozzászólást!
  • Jól van na. nem tanultam Delphit.
    még a delphi is nehezen megy, nem hogy átültetni c++ -t delphi-be
    Mutasd a teljes hozzászólást!
  • Egyébként miért nem a skype api-t használod, lásd itt
    Mutasd a teljes hozzászólást!
  • Akkor nem biztos, hogy komolyabb winapi ismereteket igénylő programmal kéne delphi-ben kezdened. Válaszz inkább olyan nyelvet, ami közelebb áll hozzád és támogatja a winapi függvények hívását.

    Jelen tudásszinted alapján vagy megírja neked készre a programot vki vagy nem fogod tudni megcsinálni. Bár hozzátenném, hogy a lényeg a különböző winapi függvények használata.

    De azt is hozzátenném, hogy rejtett ikon esetén nem fogod tudni findwindow-val megtalálni az ikon.
    Mutasd a teljes hozzászólást!
  • nem vagyok programozó, csak néha vannak ilyen kisebb dolgok, amit szeretnék megvalósitani. mint pl. ez is.
    tulajdonképpen öcsém kint van Hollandiába, jó anyám beszélgetne vele skype-on, de annyira nem ért a géphez, hogy megnyissa a skypeot. neki szerettem volna egy olyat csinálni, hogy bekapcsolja a gépet, és automatikusan hivja öcsémet, neki ne kelljen semmit csinálni, mert ennyire nem megy neki.
    Én meg azért vagyok itt, mert nem értek ehhez annyira.
    Mutasd a teljes hozzászólást!
  • ikon nem rejtett.
    annyira nem sulyos.
    szoval find system tray, sendmessage neki

    próbálkozok
    (tudod az a helyzet, hogy a google a barátom, prog.hu a testvérem, de ha nem tudom mit keressek....... )

    és köszönöm az eddigieket
    Mutasd a teljes hozzászólást!
  • ennyit vagyok hajlandó tenni az ügy érdekében:
    var hwndSkype: HWND; hwndSkype := FindWindow('tSkMainForm', nil); if hwndSkype <> 0 then begin ShowWindow(hwndSkype, SW_SHOWMAXIMIZED); end;

    Ennek csak annyi a mellékhatása, hogy nem zárható be utána az ablak, csak akkor, ha ügyködünk rajta valamit.
    Mutasd a teljes hozzászólást!
  • értem!!! köszönöm!!!
    mindjárt próbálom
    Ez egyszerü
    Mutasd a teljes hozzászólást!
  • Mégsem lesz jó, mert XP betöltésekor a skype főablaka még nem teljesen komplett, így inkább csak egy üres ablak látszik.

    Tehát egy jobb megoldás, ami még mindig nem túl bonyolult:
    uses ...ExtCtrls...; function EnumWindowsProc(Wnd: HWND; lParam: LPARAM): Boolean; stdcall; var ClassName: array[0..32] of Char; begin GetClassName(Wnd, ClassName, 32); if ClassName = 'TPUtilWindow' then begin begin // Ha itt hibát adna, akkor WM_USER + 1 a WM_SYSTEM_TRAY_MESSAGE helyett SendMessage(Wnd, WM_SYSTEM_TRAY_MESSAGE, 0, WM_LBUTTONDBLCLK); Wnd := FindWindow('tSkMainForm', nil); if IsWindowVisible(Wnd) then begin ShowWindow(Wnd, SW_MAXIMIZE); Result := False; Exit; end; end; end; Result := True; end; // így kell meghívni EnumWindows(@EnumWindowsProc, 0);

    ...

    Még annyit, hogy delphi ne fusson közben.
    Mutasd a teljes hozzászólást!
  • Hát igen.
    Ez az elegánsabb megoldás.
    Én úgy csináltam volna, hogy egy timer-el kérdezem le a program indítása után mondjuk 1 perccel.
    Mutasd a teljes hozzászólást!
  • Na igen, de az már a következő probléma. A fenti kód csak az egyik része.:)
    Mutasd a teljes hozzászólást!
  • Nos, megvan a megoldás, viszont a feltett kérdésre megkaptam a helyes választ, igy a pont a tiéd. A gond csak az, hogy ezzal a megoldással "nem készül" el az ablak teljesen, a kontrolokra nem lehet kattintani, nem működnek.
    Nekem közben sikerült megoldani, nagyon egyszerűen, win indítása után kb 1 perccel:

    winexec('C:\Program Files\Skype\Phone\Skype.exe', SW_showmaximized);

    Ezután már csak:

    SetCursorPos(108, 290); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

    kell 3 helyen, nem árt timer-ekbe tenni.
    Persze lehet még finomítgatni, hogy fut-e a program....

    Köszönöm a segítséget.
    Mutasd a teljes hozzászólást!
  • De a legegyszerűbb:
    1, Skype parancsikon, tulajdonságok, futtatás "teljes méretű"
    2, ""C:\Program Files\Skype" /maximized/regrun"

    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd