Jag har ett API, som exekverar Start-menyns sökfunktion. API:et, ShellExecute, anropas från en meny i Excel, varför man skulle kunna anta att Excel skulle bli aktivt fönster/applikation - eller vad det heter - när Sök-fönstret stängts eftersom Excel var aktivt innan sökfunktionen startades. Vad som ofta händer är istället, att någon annan applikation blir främsta fönster. Finns det någon möjlighet (tex ett API) att sätta det anropande Excel-fönstret till Z-order 1 i operativsystemet innan sökfunktionen startas, så att Excel aktiveras när sökfunktionens fönster stängs? Du kan ju prova med: SetWindowPos() Jag har prövat alla möjliga kombinationer av parameterinställningar för SetWindowPos() - ingen förändring. Du skickar ju med fönsterhandtaget till skrivbordet med GetDesktopWindow() och inte handtaget till excel. Kan bero på det. Ja, problemet verkar ligga i handtaget. I VB-kod för API-anrop jag tittat på har det ofta stått Me.hwnd. Me fungerar inte i VBA för Excel eftersom Me är förbehållet klassmoduler och koden blir omöjlig att köra om det står kvar. Jag har därför tagit bort Me och prövat att ersätta det med enbart hwnd eller GetForegroundWindow i tron om att det senare skulle returnera handtaget till Excel men det verkar det inte göra i just detta fall. Jag dock i andra fall framgångsrikt kunnat utesluta Me ur Me.hwnd och öppna/köra: dokument, mappar och program men det kanske bara varit mest tur. Felet ligger i att jag använt DoEvents mellan API-anropet som startar sökfunktionen och SendKeys, som skickar filnamnet. Avsikten med DoEvents var att skapa en paus för att sökfönstret skulle få tid på sig att komma fram och ta emot filnamnet från SendKeys. Ofta skickas annars bara filnamnet ut i "tomma rymden". När jag tog bort DoEventsfunktion, blev Excel aktivt fönster om också med grå (mot normalt blå) namnlist. I VBA-hjälpen sägs funktionen Timer kunna skapa en paus för mitt ändamål men samma problem med fönsteraktivering uppstod. Nu har jag lagt in en meningslös loop istället, så får vi se om det fungerar, annars får jag återkomma med en annan fråga.Ange Z-order 1 för ett fönster
Sv: Ange Z-order 2 för ett fönster
MEn jag tror det mer beror på att det är skillda processer.Sv: Ange Z-order 2 för ett fönster
Typiskt sett aktiveras det fönster som var aktivt innan ShellExecute kördes från Excel och med andra ord Excel var aktivt fönster eller vad det heter. Det har rört sig om textfiler, mappfönster, Explorer-instanser och olika kontrollpanelsdialoger. Stänger man fönstret som aktiverats oönskat och upprepar proceduren med att försöka köra en fil och starta sökfunktionen när den inte hittas, så upprepas inte felet utan Excel blir aktivt fönster.
I Aktivitetsfältet sammanhang aktiveras fönstret längst till höger på Aktivitetsmenyn men eftersom även tex kontrollpanelsfiler typ TIMEDATE.CPL aktiveras när Sök-funktionen avslutats gäller inte en sådan regel förbehållslöst.
De fönster som aktiveras oönskat har alla öppnats med ShellExecute i en annan procedurer än den aktuella. Det visar sig att detta fönster faktiskt aktiveras redan innan sökfunktionen startas (i vart fall mappfönster). Kan det vara så att det tidigare fönstrets ID-nummer ligger kvar någonstans och aktiveras i brist på annat fönster eller liknande i det senare API-anropet? Är det någon buffer som ska tömmas?Sv: Ange Z-order 1 för ett fönster
Sv: Ange Z-order 1 för ett fönster
Min arbetshypotes är nu att jag måste få tag på hantaget till den aktuella Excel-instansen men har ännu inte hittat något i VBA för Excel som lämnar denna information. Har du någon aning om hur det ska göras i VBA eller om jag kan använda något API för att returnera hantaget till anropande Excel-instans?Sv: Ange Z-order 1 för ett fönster
Tack för hjälpen, Andreas!
Lars