I also tried Russells suggestion about setting the foreground window and it 
don’t work for me (Windows 8.1)

 

I tested this earlier on W7 by starting another program, so my main program 
lost focus. My main program was triggering
SetForegroundWindow(forms.application.mainWindow.handle) 
from a timer and it worked OK. That is, focus returned to my main program when 
the timer went off.

Just now I ran 
bcdShellExecute(<path toExcel>);
SetForegroundWindow(forms.application.mainWindow.handle);
and focus was not returned to my main program, it stayed with Excel.

As a guess I tried 
bcdShellExecute(<path toExcel>);
Sleep(150);
SetForegroundWindow(forms.application.mainWindow.handle);
and focus was returned to my main program. We can each guess what this means 
about interrupting a starting program in W7.

I tried a similar test on W8.1 and focus is not returned to my main program 
even using sleep(1250).

R

From: [email protected] 
[mailto:[email protected]] On Behalf Of John Bird
Sent: Friday, 25 July 2014 12:22 a.m.
To: NZ Borland Developers Group - Delphi List
Subject: Re: [DUG] Shellexecute question

 

Hey that should have been perfect, as I already was doing SW_SHOWMINIMIZED 
which works fine, and so does SW_SHOWNOACTIVE  which also does what it should – 
start the other window but not change focus.

 

However SW_SHOWMINNOACTIVE doesn’t work.   Now the other program is a Delphi 
program of mine that does some initialisation in the Formshow event (turning on 
timers etc) and I am wondering if somehow the event doesn’t fire.  The process 
starts, but nothing runs, looks asleep in Task Manager. Not worth messing 
around with, as its a minor issue.

 

I toyed with using SW_SHOWINACTIVE and getting the program (Program B) to 
minimise itself on start, but that is just damned complicated and 
fiddly/fragile.  It also seems prone to ending up with 2 icons on the task bar, 
as though multiple copies have started even if only one is running – (maybe due 
to the large amount of work it does on startup – it is unresponsive for a good 
while) .

 

I also tried Russells suggestion about setting the foreground window and it 
don’t work for me (Windows 8.1)

 

What I did in the end was go back to the SW_SHOWMINIMIZED and then after the 
ShellExecute (in Program A) I put a ShowMessage saying I had started the other 
program.   Because this gives a modal clue that they have to click on to 
continue it will do the job of setting the focus back.  And its a bit useful 
for them to be informed it has been started.

 

 

From: Jolyon Smith <mailto:[email protected]>  

Sent: Thursday, July 24, 2014 8:21 PM

To: Russell Belding <mailto:[email protected]>  ; NZ Borland Developers 
Group - Delphi List <mailto:[email protected]>  

Subject: Re: [DUG] Shellexecute question

 

Have you tried passing SW_SHOWMINNOACTIVE instead of SW_MINIMIZED ? 

 

Caveat:  The show flag parameter is merely passed to the application being 
executed.  What it chooses to do with that flag is it's own affair, but if 
you're lucky, it will respect your wishes.  If not, then you will have to 
engage in a focus window arms race/lotto as already suggested.  But Route #1 
would be to try the officially mandated mechanisms.

Good luck.  :)

 

On 24 July 2014 19:46, russell <[email protected]> wrote:

Tyr this after spawning the other program.

 

SetForegroundWindow(forms.application.mainWindow.handle)

 

To give the main window of your program focus.

Perhaps modifications of this will take you to the window of the calling 
program where you want the focus?

 

Russell

 

From: [email protected] 
[mailto:[email protected]] On Behalf Of John Bird
Sent: Thursday, 24 July 2014 4:43 p.m.
To: NZ Borland Developers Group - Delphi List
Subject: [DUG] Shellexecute question

 

I have a program (Program A) that fires up another (program B)  via 
ShellExecute, if its not already running.  However even though Program B is 
started minimised, focus shifts away from Program A, which is a minor nuisance.

 

Is there any way to stop this within Delphi?  Or will I have to do something 
like delve into the Windows API?

 

if ShellExecute(Application.Mainform.Handle, 'open', Pchar(aProgName), 
PChar(aparaml), PChar(aDir), SW_SHOWMINIMIZED) <= 32 then

  ShowMessage('Start Minimised error:')

 


_______________________________________________
NZ Borland Developers Group - Delphi mailing list
Post: [email protected]
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to [email protected] with 
Subject: unsubscribe

 

  _____  

_______________________________________________
NZ Borland Developers Group - Delphi mailing list
Post: [email protected]
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to [email protected] with 
Subject: unsubscribe

_______________________________________________
NZ Borland Developers Group - Delphi mailing list
Post: [email protected]
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to [email protected] with 
Subject: unsubscribe

Reply via email to