<div dir="ltr">This doesn&#39;t really establish anything other than what we already know... that it is incredibly difficult to reliably anticipate in one thread something that is happening in some other thread.<div><br></div>
<div>Prog A &gt; launch Prog B</div><div><br></div><div>In simplistic terms you now have two threads, let&#39;s call them Thread A and B (corresponding to each program, A and B).  If Thread A now does something that might interfere with/be interefered with by something occuring on Thread B then if you want any sort of reliable behaviour there has to be some co-ordination between the threads.  Anything else is built on an assumption or set of assumptions that may or may not be valid at any given time.<br>
<br>In this case, if Thread A tries to SetForegroundWindow() because it believes that Thread B has &quot;stolen&quot; it, then it&#39;s attempt to steal it back is only going to succeed if the call to SetForegroundWindow() occurs AFTER Thread B has in fact stolen it.  If Thread A reclaims the focus BEFORE Thread B has nicked it, then Trehad B is still going to end up stealing the focus.</div>
<div><br></div><div>Thread A can build in an assumption that if it waits a certain amount of time then Thread B will probably have completed it&#39;s stealing activity, but this is still an assumption and is just as vulnerable to failure.</div>
<div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On 25 July 2014 16:17, russell <span dir="ltr">&lt;<a href="mailto:russell@belding.co.nz" target="_blank">russell@belding.co.nz</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-NZ" link="blue" vlink="purple"><div><div class=""><p class="MsoNormal"><i><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">I also tried Russells suggestion about setting the foreground window and it don’t work for me (Windows 8.1)<u></u><u></u></span></i></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p></div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">I tested this earlier on W7 by starting another program, so my main program lost focus. My main program was triggering<br>
 </span><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">SetForegroundWindow(forms.application.mainWindow.handle) <br>from a timer and it worked OK. That is, focus returned to my main program when the timer went off.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Just now I ran <br>bcdShellExecute(&lt;path toExcel&gt;);<br>SetForegroundWindow(forms.application.mainWindow.handle);<br>
and focus was not returned to my main program, it stayed with Excel.<br><br>As a guess I tried <br>bcdShellExecute(&lt;path toExcel&gt;);<br>Sleep(150);<br>SetForegroundWindow(forms.application.mainWindow.handle);<br>and focus was returned to my main program. We can each guess what this means about interrupting a starting program in W7.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">I tried a similar test on W8.1 and focus is not returned to my main program even using sleep(1250).<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">R<u></u><u></u></span></p><div><div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a href="mailto:delphi-bounces@listserver.123.net.nz" target="_blank">delphi-bounces@listserver.123.net.nz</a> [mailto:<a href="mailto:delphi-bounces@listserver.123.net.nz" target="_blank">delphi-bounces@listserver.123.net.nz</a>] <b>On Behalf Of </b>John Bird<br>
<b>Sent:</b> Friday, 25 July 2014 12:22 a.m.</span></p><div class=""><br><b>To:</b> NZ Borland Developers Group - Delphi List<br></div><b>Subject:</b> Re: [DUG] Shellexecute question<u></u><u></u><p></p></div></div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p><div><div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">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.<u></u><u></u></span></p>
</div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"> <u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">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.<u></u><u></u></span></p>
</div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"> <u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">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) .<u></u><u></u></span></p>
</div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"> <u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">I also tried Russells suggestion about setting the foreground window and it don’t work for me (Windows 8.1)<u></u><u></u></span></p>
</div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"> <u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">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.<u></u><u></u></span></p>
</div><div><div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black"> <u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black"> <u></u><u></u></span></p>
</div><div><div><p class="MsoNormal" style="background:whitesmoke"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black">From:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black"> <a href="mailto:jsmith@deltics.co.nz" title="jsmith@deltics.co.nz" target="_blank">Jolyon Smith</a> <u></u><u></u></span></p>
</div><div><p class="MsoNormal" style="background:whitesmoke"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black">Sent:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black"> Thursday, July 24, 2014 8:21 PM<u></u><u></u></span></p>
</div><div><p class="MsoNormal" style="background:whitesmoke"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black">To:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black"> <a href="mailto:russell@belding.co.nz" title="russell@belding.co.nz" target="_blank">Russell Belding</a> ; <a href="mailto:delphi@listserver.123.net.nz" title="delphi@listserver.123.net.nz" target="_blank">NZ Borland Developers Group - Delphi List</a> <u></u><u></u></span></p>
</div><div><p class="MsoNormal" style="background:whitesmoke"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black">Subject:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black"> Re: [DUG] Shellexecute question<u></u><u></u></span></p>
</div></div></div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"> <u></u><u></u></span></p></div></div><div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">Have you tried passing </span><strong><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:#2a2a2a">SW_SHOWMINNOACTIVE instead of SW_MINIMIZED ?</span></strong><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"> <u></u><u></u></span></p>
<div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"><u></u> <u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Segoe UI&quot;,&quot;sans-serif&quot;;color:#2a2a2a">Caveat:  The show flag parameter is merely passed to the application being executed.  What it chooses to do with that flag is it&#39;s own affair, but if you&#39;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.<br>
<br>Good luck.  :)</span><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"><u></u><u></u></span></p></div></div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"><u></u> <u></u></span></p>
<div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">On 24 July 2014 19:46, russell &lt;<a href="mailto:russell@belding.co.nz" target="_blank">russell@belding.co.nz</a>&gt; wrote:<u></u><u></u></span></p>
<div><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Tyr this after spawning the other program.</span><span style="color:black"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"> <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">SetForegroundWindow(forms.application.mainWindow.handle)</span><span style="color:black"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"> <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">To give the main window of your program focus.</span><span style="color:black"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Perhaps modifications of this will take you to the window of the calling program where you want the focus?</span><span style="color:black"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"> <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Russell</span><span style="color:black"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"> <u></u><u></u></span></p><div><div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm"><p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a href="mailto:delphi-bounces@listserver.123.net.nz" target="_blank">delphi-bounces@listserver.123.net.nz</a> [mailto:<a href="mailto:delphi-bounces@listserver.123.net.nz" target="_blank">delphi-bounces@listserver.123.net.nz</a>] <b>On Behalf Of </b>John Bird<br>
<b>Sent:</b> Thursday, 24 July 2014 4:43 p.m.<br><b>To:</b> NZ Borland Developers Group - Delphi List<br><b>Subject:</b> [DUG] Shellexecute question</span><span style="color:black"><u></u><u></u></span></p></div></div><div>
<div><p class="MsoNormal"><span style="color:black"> <u></u><u></u></span></p><div><div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black">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.</span><span style="color:black"><u></u><u></u></span></p>
</div><div><p class="MsoNormal"><span style="color:black"> <u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:black">Is there any way to stop this within Delphi?  Or will I have to do something like delve into the Windows API?</span><span style="color:black"><u></u><u></u></span></p>
</div><div><p class="MsoNormal"><span style="color:black"> <u></u><u></u></span></p></div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">if ShellExecute(Application.Mainform.Handle, &#39;open&#39;, Pchar(aProgName), PChar(aparaml), PChar(aDir), SW_SHOWMINIMIZED) &lt;= 32 then</span><span style="color:black"><u></u><u></u></span></p>
</div><div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">  ShowMessage(&#39;Start Minimised error:&#39;)</span><span style="color:black"><u></u><u></u></span></p></div>
<div><p class="MsoNormal"><span style="color:black"> <u></u><u></u></span></p></div></div></div></div></div></div></div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"><br>
_______________________________________________<br>NZ Borland Developers Group - Delphi mailing list<br>Post: <a href="mailto:delphi@listserver.123.net.nz" target="_blank">delphi@listserver.123.net.nz</a><br>Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
Unsubscribe: send an email to <a href="mailto:delphi-request@listserver.123.net.nz" target="_blank">delphi-request@listserver.123.net.nz</a> with Subject: unsubscribe<u></u><u></u></span></p></div><div><p class="MsoNormal">
<span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"> <u></u><u></u></span></p></div></div><div class="MsoNormal" align="center" style="text-align:center"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black"><hr size="2" width="100%" align="center">
</span></div><p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:black">_______________________________________________<br>NZ Borland Developers Group - Delphi mailing list<br>Post: <a href="mailto:delphi@listserver.123.net.nz" target="_blank">delphi@listserver.123.net.nz</a><br>
Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>Unsubscribe: send an email to <a href="mailto:delphi-request@listserver.123.net.nz" target="_blank">delphi-request@listserver.123.net.nz</a> with Subject: unsubscribe<u></u><u></u></span></p>
</div></div></div></div></div></div></div><br>_______________________________________________<br>
NZ Borland Developers Group - Delphi mailing list<br>
Post: <a href="mailto:delphi@listserver.123.net.nz">delphi@listserver.123.net.nz</a><br>
Admin: <a href="http://delphi.org.nz/mailman/listinfo/delphi" target="_blank">http://delphi.org.nz/mailman/listinfo/delphi</a><br>
Unsubscribe: send an email to <a href="mailto:delphi-request@listserver.123.net.nz">delphi-request@listserver.123.net.nz</a> with Subject: unsubscribe<br></blockquote></div><br></div>