Jump to content
PawelPepe

TTrayIcon (Hidden main window and second form)

Recommended Posts

Hey,
I am trying to write simple application that works with Windows Clipboard (capture Clipboard changes (WM_CLIPBOARDUPDATE) and do some actions.

Application uses TTrayIcon component. So, I can hide main window in notification area.

If user press Print Screen button or copy text into Clipboard my application do some actions. One of the features is to show user a message (with some description text, icon etc) when application is hidden in tray. I do not use TTrayIcon Balloon hint (it is not good for me). Instead, I created second form and display it when clipboard change its content.

 

It works fine, when application main window is visible (on screen). I set some options in form OnShow event and do some animation (to slide from right screen corner) in OnActivate event. It is OK.

 

When application main window is hidded there is a big problem! 
What I do:
Form2.Show; -> OnShow And OnActivate events are fired.
BUT, if I show form2 again (second, third time), only OnShow event is fired - OnActivate event is not working! WHY?

 

I hide mainform to Tray:

   Application.ShowMainForm := False;
   MainFrm.Hide;
   ShowWindow(Application.Handle, SW_HIDE);

 

And I show it using:

   MainFrm.Show;
   Application.ShowMainForm := True;
   ShowWindow(Application.Handle, SW_SHOW);
   Application.BringToFront();


-Pawel

Share this post


Link to post
3 hours ago, PawelPepe said:

When application main window is hidded there is a big problem! 

 

What I do:
Form2.Show; -> OnShow And OnActivate events are fired.
BUT, if I show form2 again (second, third time), only OnShow event is fired - OnActivate event is not working! WHY?

Are you merely hiding and reshowing Form2 on each message?  Or are you fully destroying and recreating it?

3 hours ago, PawelPepe said:

I hide mainform to Tray:


   Application.ShowMainForm := False;
   MainFrm.Hide;
   ShowWindow(Application.Handle, SW_HIDE);

 

And I show it using:


   MainFrm.Show;
   Application.ShowMainForm := True;
   ShowWindow(Application.Handle, SW_SHOW);
   Application.BringToFront();

 

FYI, Application.ShowMainForm only affects the startup of Application.Run(), so once the app is up and running then setting ShowMainForm has no effect.  Also, hiding/showing the Application.Handle is only useful in this case if Application.MainFormOnTaskbar is false, which is not the default in modern Delphi projects.

Share this post


Link to post
Posted (edited)

I am hiding and reshowing Form2 on each message.


 

Quote

 

Application.ShowMainForm only affects the startup of Application.Run()

 

 

 

You are right!

 

Quote

Also, hiding/showing the Application.Handle is only useful in this case if Application.MainFormOnTaskbar is false, which is not the default in modern Delphi projects.

Again, you are right (I use default - Application.MainFormOnTaskbar := True).

 

 

So, now it looks like this. Hiding:

   MainFrm.Hide;

Showing:

   MainFrm.Show;
   Application.BringToFront();

 

 

 

Unfortunatelly, nothing has changed. 

Maybe I will prepare example test app to show what I have and what I want to achieve?

I also tried to dynamically create Form2 and destroy it on each message (but I failed with my "animation" and modal window).

 

-Pawel

 

Edited by PawelPepe

Share this post


Link to post
Posted (edited)

Thanks for help.

I think I got it working now. I decided to create form and destroy it each time clipboard is updated.

Relying on onShow and onActivate events was not good idea.

-Pawel

Edited by PawelPepe

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×