Toon posts:

[delphi] foreground window @ klokbar

Pagina: 1
Acties:

Verwijderd

Topicstarter
Zit met het volgende probleem :

Kan nergens vinden hoe ik een programma dat naast de klok draait ( winxp )
te activaten als foreground window..

normale programma wat niet in die bar staat doe je dat via de SetForegroundWindow funktie. Iemand een idee hoe ik het voor elkaar kan krijgen?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Er zit bij mijn weten geen standaard component in Delphi dat een programma in de tray kan laten draaien. Je zult dus een component hebben gedownload, en dan kan ik niet raden wat je dan moet doen... Het component dat ik ervoor gebruik heeft een property die ervoor zorgt dat ie automatisch weer naar de voorgrond gaat bij een dubbelklik. Dat component had ik van torry.net.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
zou je die link kunnen posten of die source kunnen linken op een manier zou ig erg super zijn!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Hoi BIERAAP, en welkom op GoT :)

Ik snap eigenlijk geen bal van je vraag om eerlijk te zijn :X Wat is een 'programma dat naast de klok draait'? Bedoel je toevallig de system tray daar, met de systray icons? Die worden namelijk enkel door een programma actief daar geplaatst, en hebben in principe weinig van doen met de windows van het programma zelf. Sterker nog: de meeste systray-icons horen bij services en hebben dus niet eens een window normaliter.

Ergo, licht je vraag eens wat verder toe :) Lees ook eens P&W FAQ - De "quickstart", dat kan wellicht behulpzaam zijn ;)

Professionele website nodig?


Verwijderd

Topicstarter
nou wellicht ken je flashfxp als daar op f9 drukt gaat hij naast je klok staan.
kon dus nergens een unit / funktie vinden die hem weer als foreground kon zetten.
Daar ben ik dus naar op zoek.


edit:

heb btw een aantal liters bier op dus kan zijn dat ik soms raar typ.

[ Voor 19% gewijzigd door Verwijderd op 06-08-2004 02:09 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14:53

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 06 augustus 2004 @ 02:01:
zou je die link kunnen posten of die source kunnen linken op een manier zou ig erg super zijn!
Ik weet nog dat het component CoolTray heette, daarmee moet je het wel kunnen vinden op Torry.net. Maar als je zegt welk component je nu gebruikt, dan kan iemand je daar misschien ook wel mee helpen...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 02-01 05:18

KompjoeFriek

Statsidioot

Nou zat aapje :P

kijk hier eens.
heb je meteen een berg makkelijke opties bij de hand mocht het nodig zijn :)
NMe84 schreef op 06 augustus 2004 @ 02:12:
[...]
Ik weet nog dat het component CoolTray heette, daarmee moet je het wel kunnen vinden op Torry.net. Maar als je zegt welk component je nu gebruikt, dan kan iemand je daar misschien ook wel mee helpen...
CoolTray heb ik ook gehad, NLDTrayIcon vond ik leuker :)

WhatPulse! - Rosetta@Home - Docking@Home


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function FindWindowByTitle(WindowTitle: string): Hwnd;
var 
  NextHandle: Hwnd; 
  NextTitle: array[0..260] of char;
begin 
  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
  while NextHandle > 0 do 
  begin 
   GetWindowText(NextHandle, NextTitle, 255); 
    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then 
    begin 
      Result := NextHandle; 
      Exit; 
    end 
    else 
      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT); 
  end; 
  Result := 0; 
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 Handle: HWND;
begin
Handle:=FindWindowByTitle('just-an-util');
if Handle<>0 then
 begin
  SetForegroundWindow(Handle);
  Application.Terminate;
  end
else Application.Terminate;
end;


Deze procedure zet wel een programma als foreground maar geen programma wat in de tray staat ( naast de klok ). :(

edit:

Het is dus een programma wat een andere tool dat in de tray staat ( bij de klok ) op de foreground zou moeten zetten

[ Voor 10% gewijzigd door Verwijderd op 06-08-2004 02:22 ]


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Ik denk dat ik begrijp wat je bedoeld! Je wilt een programma maken dat als het ware enkel- of dubbelklikt op een tray-icon. Vaak heeft zo'n icon een geaccocieerd window en dat wil je zichtbaar maken.

Als je een window handle ervan te pakken kunt krijgen zou je een click of double-click message ernaartoe kunnen sturen. Maar hoe je dat voor elkaar krijgt zou ik niet zo een-twee-drie weten.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

- Zoek de desktop (findwindow)
- Zoek de traybar (findchildwindow, parent= desktop)
- Zoek jouw window (findchildwindow, parent=traybar)

voorbeeld code, om de clock te vinden, met wat aanpassingen te gebruiken voor jouw doel denk ik.

Delphi:
1
2
3
4
5
6
7
8
9
function FindClock : hwnd
var
  TrayHandle, ShellHandle: HWnd;
begin
  // Handle zoeken van Clock & Traybar
  ShellHandle := FindWindow('Shell_TrayWnd', nil);
  TrayHandle  := FindWindowEx( ShellHandle, 0, 'TrayNotifyWnd', nil);
  result := FindWindowEx(TrayHandle, 0, 'TrayClockWClass', nil);
end; 

[ Voor 116% gewijzigd door Verwijderd op 06-08-2004 09:15 ]


Verwijderd

Topicstarter
Infinitive schreef op 06 augustus 2004 @ 08:42:
Ik denk dat ik begrijp wat je bedoeld! Je wilt een programma maken dat als het ware enkel- of dubbelklikt op een tray-icon. Vaak heeft zo'n icon een geaccocieerd window en dat wil je zichtbaar maken.

Als je een window handle ervan te pakken kunt krijgen zou je een click of double-click message ernaartoe kunnen sturen. Maar hoe je dat voor elkaar krijgt zou ik niet zo een-twee-drie weten.
JUIST! das precies wat ik bedoel !
alleen ik zou het ook niet ff zo 1 2 3 weten :s misschien kan iemand me ermee stappie opweg helpen?

Verwijderd

Verwijderd schreef op 06 augustus 2004 @ 14:51:
[...]
JUIST! das precies wat ik bedoel !
alleen ik zou het ook niet ff zo 1 2 3 weten :s misschien kan iemand me ermee stappie opweg helpen?
[rml]maui71 in "[ delphi] foreground window @ klokbar"[/rml]
en zelf ff wat uitzoeken om de code aan te passen naar jouw behoeften.

Hier idd een leuke uitleg, over het vinden van de positie van een trayicon

[ Voor 11% gewijzigd door Verwijderd op 07-08-2004 00:53 ]


Verwijderd

Voor zover ik het weet, kun je de iconen in de tray (naast de klok) niet individueel benaderen en er informatie over opvragen. Je kunt dus enkel de coördinaten opvragen van het gebied waar alle iconen in staan, via de handle van 'TrayNotifyWnd' (kijk naar de code van maui71) en daarna een GetWindowRect-call om de positie en grootte daarvan op te vragen.

Eén oplossing om de coördinaten van een van te voren bekend icoon op te vragen, is het maken van een bitmap van het gebied waar alle iconen in staan. In die bitmap kun je dan, pixel-per-pixel, gaan zoeken naar jouw icoon. Dit werkt uiteraard niet goed voor iconen die erg dynamisch zijn en dus steeds veranderen.

Wanneer je zo'n manier gebruikt om achter de precieze plek van een icoon te komen, kun je een muisklik (of dubbelklik) simuleren. Dit zou moeten kunnen met de functie SendInput. (ik heb dit nog nooit geprobeerd)

Lees vooral ook eens wat informatie uit verschillende nieuwsgroepen, via Google Groups. Bijvoorbeeld bij zoeken op 'tray icon position'. Je bent namelijk niet de enige die dit voor elkaar wil krijgen.

Verwijderd

"losse gedachte"

Als TS het programma wat bij een TrayWindow hoort naar voren wilt toveren, hoeft ie zich niet zozeer druk te maken over de trayicon op zich. Zover ik weet hebben al deze applicaties ook een hidden form draaien in windows, en kan je deze gewoon naar boven toveren aan de hand van de classname en/of caption.
(het proggie windowse is heel handig om achter dit soort gegevens, -classnames,captions, parentwindows etc- te komen)

voorbeeld, ik heb mailwasher in de traybar staan, om nu het mailwasher scherm naar voren te toveren, hoef ik alleen de volgende code uit te voeren:
code:
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject);
var
 h : hwnd;
begin
  h  := FindWindow('TMailWasherClassicform',  'MailWasher version 2.0');
  ShowWindow(h, sw_normal);
end;


Werkt dus niet altijd ..... (heb ook ff mbm5 geprobeerd)

Hier idd een leuke uitleg, over het vinden van de positie van een trayicon:
http://www.codeproject.com/shell/ctrayiconposition.asp

[ Voor 46% gewijzigd door Verwijderd op 07-08-2004 00:54 ]


Verwijderd

Topicstarter
YES TIS ME GELUKT! :P

code:
1
2
3
4
5
6
  SendMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
  ShowWindow(Handle, SW_SHOW);
  SetForegroundWindow(Handle);
  hOwner := GetWindow(Handle, GW_OWNER);
  SendMessage(hOwner, WM_SYSCOMMAND, SC_RESTORE, 0);
  ShowWindow(hOwner, SW_SHOW);



dat waren de magische regels :)

als iemand nog verbeteringen zie ? :)
Pagina: 1