Second Instance in combinatie met een TrayIcon

Pagina: 1
Acties:

  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
hallo ,

ik heb een prog met een TrayIcon (niet een component, maar gebaseerd op de tip uit D-TNT)
nou heb ik daar een 'second instance' check aan toegevoegd, die moet ontdekken of het proggie voor de tweede keer opgstart word.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
  hw : HWND;
begin
  hw := FindWindow('TApplication','myprog');

  if hw <> 0 then (* prog is running *)
    begin
      ShowMessage('prog is running');
      ShowWindow(hw,SW_RESTORE);

      SetForeGroundWindow(hw);
      Application.Restore;
      application.BringToFront;
    end
  else
    begin (* Application isn't running *)
    Application.Title := 'myprog';
    Application.HelpFile := 'myprog.HLP';
    Application.CreateForm(TDDMainForm, DDMainForm);
    Application.Run;
    end;
end.

ok, dit werkt. Maar nu wil ik de foucus op mijn app zetten, en dit werkt niet :(

ik gebruik 'hide' en 'visible' om het proggie te verbergen naar de taskbar

deze code zorgt er wel voor dat het programma minimized word maar 'restore' is disabled.

vergeet ik iets??


bedankt,

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Klopt dit wel:
code:
1
2
      Application.Restore;
      application.BringToFront;

in je if statement als je programma WEL draait?

Verder kun je een bericht sturen naar je andere app (die dus al draait) dat hij ontop moet komen.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Zo:

Je weet dat je app al draait omdat je een FindWindow hebt gedaan, dan doe je alleen dit:
code:
1
    PostMessage(hPrevious, WM_USER_BRINGTOFRONT, 0, 0);

Hier is:
code:
1
2
const
  WM_USER_BRINGTOFRONT = WM_APP + 101;

In je programma doe je:
code:
1
2
3
4
5
6
7
8
9
10
    procedure MessageBringToFront(var Msg: TMessage); message WM_USER_BRINGTOFRONT;

...

procedure TMainForm.MessageBringToFront(var Msg: TMessage);
begin
  MainForm.Visible := True;
  Application.Restore;
  Application.BringToFront;
end;

Is dit een oplossing?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Jou code hierboven wordt dan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  hw : HWND;
begin
  hw := FindWindow('TApplication','myprog');
  if hw <> 0 then (* prog is running *)
    begin
      ShowMessage('prog is running');
      PostMessage(hPrevious, WM_USER_BRINGTOFRONT, 0, 0);   
    end
  else
    begin (* Application isn't running *)
    Application.Title := 'myprog';
    Application.HelpFile := 'myprog.HLP';
    Application.CreateForm(TDDMainForm, DDMainForm);
    Application.Run;
    end;
end.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
sorry, maar ik snap niet helemaal hoe ik de code moet aanpassen.. :(

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Heb ik hierboven toch allemaal beschreven?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
moet dat ingevoegd worden bij de .dpr file ?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op vrijdag 05 april 2002 23:33 schreef MisterE het volgende:
moet dat ingevoegd worden bij de .dpr file ?
o.a.

Deze wel, en de rest in je MainForm van je app.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
bedabk in ieder geval, ik zit altijd te klooien met die 'windows messages'. ben ook bezig met hoe ik er achter kan komen of de desktop iconen van kleur veranderen (de tekst dan).

moet dat met een WM_PAINT ?? weet je dat toevallig?

bedankt...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Nope, sorry.

Maar check gewoon http://groups.google.com/, daar vind je veel van dat soort dingen wel terug.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
ok bedankt, maareh ik ga nu maffen.....

have phun.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Waarmee?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
hoe bedoel je ??? waarmee phun hebben ?? gewoon.....wat je zoal doet ik je leven.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op vrijdag 05 april 2002 23:42 schreef MisterE het volgende:
hoe bedoel je ??? waarmee phun hebben ?? gewoon.....wat je zoal doet ik je leven.
Niet zoveel, ik ben een die-hard nerd he, dus zit alleen achter mijn PC-tje.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
tja, kan jij ook niets aan doen :)

is aan aangeboren aan/af wijking, maar ik vergeef het je wel hoor :P

diepgang weer......

he gozer, de groeten.

Verwijderd

Desktop icons veranderen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var
  ProgManHandle: HWnd;
  SHELLDLLDefViewHandle: HWnd;
  SysListView32Hanlde: HWnd;
begin
  ProgmanHandle := FindWindow('Progman', 'Program Manager');
  if ProgmanHandle = 0 then Exit;
  
  SHELLDLLDefViewHandle := FindWindowEx(ProgmanHandle, 0, 'SHELLDLL_DefView',
    nil);
  if SHELLDLLDefViewHandle = 0 then Exit;

  SysListView32Hanlde := FindWindowEx(SHELLDLLDefViewHandle, 0, 'SysListView32',
    nil);
  if SysListView32Hanlde = 0 then Exit;

  ListView_SetTextColor(SysListView32Hanlde, clRed);
  InvalidateRect(SysListView32Hanlde, nil, True);
  UpdateWindow(SysListView32Hanlde);

Beetje brakke code uit vb vertaald :)

  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
yep, maar prob. is eigenlijk dat ik wil 'intercepten' wanneer de iconen veranderd worden.
ik ben namelijk een wallpaper manager aan het maken, en ik wil er voor zorgen dat de iconen de goede kleur blijven behouden.

gebruiken van een timer vind ik geen oplossing.
ik hoop dat windows een message stuurt bij zoiets?!?

maar bedankt voor de moeite.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Misschien heb je iets aan TApplication.OnSettingChange

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Ik zal vanavond code posten hoe je dat doet ['intercepten' wanneer de iconen veranderd worden], in een nieuwe topic.

Is nogal off-topic om dat hier te doen :)
Pagina: 1