Page 1 of 1

Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 10:20 am
by BarryG
Anyone had experience with launching Win 10 apps from the command-line? My problem is this: An example app is "Samsung Flow" for transferring files via wi-fi from Win 10 to my Samsung phone. If I look at the exe name from the app's window, I get this:

Code: Select all

C:\Program Files\WindowsApps\SAMSUNGELECTRONICSCoLtd.SamsungFlux_4.7.2.0_x64__wyx1vj98g3asy\SamsungFlow.exe
You'd think that running that would start the Samsung app, but it doesn't because the OS denies access to the "WindowsApps" folder (and gives an error of "Windows cannot access the specified device, path, or file. You may not have the appropriate permissions to access the item.").

However, I have since found out I can run the Samsung app with this command-line:

Code: Select all

start shell:AppsFolder\SAMSUNGELECTRONICSCoLtd.SamsungFlux_wyx1vj98g3asy!App
So what I need to work out is how to marry the launched window's exe (at top), with the correct "Shell" command-line per the bottom. I see there's a common part of "_wyx1vj98g3asy" but not sure if that's applicable. I've Googled but can't find a way. Anyone done this sort of thing before?

Re: Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 11:00 am
by RASHAD
Hi BarryG
Try :
# 1:

Code: Select all

  AppVerb$ = "runas"
  AppName$ = "SamsungFlow.exe"
  AppDir$  = "C:\Program Files\WindowsApps\SAMSUNGELECTRONICSCoLtd.SamsungFlux_4.7.2.0_x64__wyx1vj98g3asy"
     
  shExecInfo.SHELLEXECUTEINFO
  shExecInfo\cbSize=SizeOf(SHELLEXECUTEINFO)
  shExecInfo\fMask=#Null
  shExecInfo\hwnd=#Null;
  shExecInfo\lpVerb=@AppVerb$
  shExecInfo\lpFile=@AppName$
  shExecInfo\lpDirectory=@AppDir$
  shExecInfo\nShow=#SW_NORMAL
 
  ShellExecuteEx_(shExecInfo)
# 2:

Code: Select all

ShellExecute_(#Null, @"runas", @"SamsungFlow.exe", @"", @"C:\Program Files\WindowsApps\SAMSUNGELECTRONICSCoLtd.SamsungFlux_4.7.2.0_x64__wyx1vj98g3asy", #SW_NORMAL)

Re: Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 11:05 am
by BarryG
Both fail, Rashad. I thought I had a solution a moment ago but it also failed. I'll keep researching.

Re: Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 1:24 pm
by breeze4me
A simple way.

Code: Select all

RunProgram("shell:AppsFolder\Microsoft.WindowsCalculator_8wekyb3d8bbwe!App")
A complicated way. :mrgreen:

Code: Select all

; Run Windows 8 Metro Application from Desktop Application 
; https://auahdark687291.blogspot.com/2015/01/

; Automate launching Windows 10 UWP apps
; https://docs.microsoft.com/ko-kr/windows/uwp/xbox-apps/automate-launching-uwp-apps

; How do I programmatically launch a Windows Store App from my Desktop App?
; https://www.xspdf.com/questions/40562.shtml



#AO_NONE = 0
#AO_DESIGNMODE = 1
#AO_NOERRORUI = 2
#AO_NOSPLASHSCREEN = 4

Interface IApplicationActivationManager Extends IUnknown
  ActivateApplication(*appUserModelId, *arguments, ActivateOptions, *processId)
  ActivateForFile(*appUserModelId, *itemArray, *verb, *processId)
  ActivateForProtocol(*appUserModelId, *itemArray, *processId)
EndInterface


Prototype ptCoAllowSetForegroundWindow(*pUnk, lpvReserved)

Procedure AllowSetForegroundApp(*IAAM)
  Protected Result = #S_FALSE
  Protected CoAllowSetForegroundWindow_.ptCoAllowSetForegroundWindow
  Protected Lib = OpenLibrary(#PB_Any, "Ole32.dll")
  
  If Lib
    
    CoAllowSetForegroundWindow_ = GetFunction(Lib, "CoAllowSetForegroundWindow")
    
    If CoAllowSetForegroundWindow_
      Result = CoAllowSetForegroundWindow_(*IAAM, 0)
    EndIf
    
    CloseLibrary(Lib)
  EndIf
  
  ProcedureReturn Result
EndProcedure




Define AAM.IApplicationActivationManager
Define PID


If CoInitializeEx_(0, #COINIT_APARTMENTTHREADED) = #S_OK
  
  If CoCreateInstance_(?CLSID_ApplicationActivationManager, 0, #CLSCTX_LOCAL_SERVER, ?IID_IApplicationActivationManager, @AAM) = #S_OK
    
    AllowSetForegroundApp(AAM)
    
    ; Find the Application User Model ID of an installed app
    ; https://docs.microsoft.com/ko-kr/windows/configuration/find-the-application-user-model-id-of-an-installed-app
    
    If AAM\ActivateApplication(@"Microsoft.WindowsCalculator_8wekyb3d8bbwe!App", @"", #AO_NONE, @PID) = #S_OK
      
      Debug PID
      
    EndIf
    
    AAM\Release()
    
  EndIf
  
  CoUninitialize_()
  
EndIf




DataSection
  ; ShObjIdl.h
  IID_IApplicationActivationManager:    ;"2e941141-7f97-4756-ba1d-9decde894a3d"
  Data.l $2e941141
  Data.w $7f97, $4756
  Data.b $ba, $1d, $9d, $ec, $de, $89, $4a, $3d
  
  CLSID_ApplicationActivationManager:   ;"45ba127d-10a8-46ea-8ab7-56ea9078943c"
  Data.l $45ba127d
  Data.w $10a8, $46ea
  Data.b $8a, $b7, $56, $ea, $90, $78, $94, $3c
EndDataSection

Re: Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 1:37 pm
by RASHAD
Try the next
And breeze4me snippet
And fryquez snippet (OS Specific ยป Windows)
Then report

Code: Select all

#admin_CommandFlag = "/admin"
#SEE_MASK_UNICODE = $00004000
Global  pipe_hProcess

Procedure RunProgramAdminHandle(windowid, exe.s, params.s, workingdir.s)
  Protected shellex.SHELLEXECUTEINFO
  shellex\cbSize = SizeOf(SHELLEXECUTEINFO)
  shellex\fMask = #SEE_MASK_NOCLOSEPROCESS
  shellex\hwnd = windowid
  shellex\lpVerb = @"runas"
  shellex\lpFile = @exe
  shellex\lpParameters = @params
  shellex\lpDirectory = @workingdir
  shellex\nShow = #SW_HIDE
  ShellExecuteEx_(shellex)
  ProcedureReturn shellex\hProcess
EndProcedure

Procedure ProcessRunning(hProcess)
  Protected exitcode.l
  GetExitCodeProcess_(hProcess, @exitcode)
  If exitcode = #STILL_ACTIVE
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf 
EndProcedure

If ProgramParameter(0) = #admin_CommandFlag  
  Import ""
    AttachConsole(dwProcessId)
  EndImport
  
  FreeConsole_()
  AttachConsole(Val(ProgramParameter(1)))
  
  RunProgram("cmd", "", GetCurrentDirectory(), #PB_Program_Wait)
  End 
EndIf 

pipe_hProcess = RunProgramAdminHandle(GetForegroundWindow_(), "C:\Program Files\WindowsApps\SAMSUNGELECTRONICSCoLtd.SamsungFlux_4.7.2.0_x64__wyx1vj98g3asy\SamsungFlow.exe", #admin_CommandFlag+" "+Str(GetCurrentProcessId_()), "C:\Program Files\WindowsApps")

If pipe_hProcess
  While ProcessRunning(pipe_hProcess)
    Delay(20)
  Wend
Else
  Debug "pipe_hprocess empty"
EndIf

CloseHandle_(pipe_hProcess)

Re: Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 2:29 pm
by BarryG
@breeze4me: Your longer code isn't relevant to me, because I need it to run non-Win10 apps, not native Win 10 apps.

@Rashad: Your last example with "pipe_hProcess" didn't work for me either - no app was launched. Sorry to report that!

But, I worked it out! I just had to massage the returned exe path to match the relevant app's folder name, and then used breeze4me's single RunProgram() line to launch it. Done and dusted.

The only thing I couldn't work out is if "C:\Program Files\WindowsApps" can be returned programmatically, rather than hard-coded. Can someone with a non-English Windows PC confirm if this path name is the same on there? Thanks. Here's how I've coded it for now:

Code: Select all

Global win10appdir$=GetUserDirectory(#PB_Directory_Programs) ; C:\Program Files (x86)\
a=FindString(win10appdir$," (")
If a
  win10appdir$=Left(win10appdir$,a-1)
EndIf
win10appdir$+"\WindowsApps\" ; C:\Program Files\WindowsApps\

Re: Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 3:29 pm
by breeze4me
BarryG wrote:Can someone with a non-English Windows PC confirm if this path name is the same on there?
Yes, it is the same in Korean Windows 10.

Code: Select all

Debug GetEnvironmentVariable("ProgramW6432") + "\WindowsApps\"


Edit:
proper way :?:

Code: Select all

#RRF_RT_REG_SZ = $00000002
#RRF_SUBKEY_WOW6464KEY = $00010000
;#RRF_SUBKEY_WOW6432KEY = $00020000

Prototype ptRegGetValueW(hkey, *lpSubKey, *lpValue, dwFlags.l, *pdwType, *pvData, *pcbData)

Define buffer.s{128}, ByteSize

If OpenLibrary(0, "Advapi32.dll")
  
  ; Windows Vista, Windows XP Professional x64+
  RegGetValueW_.ptRegGetValueW = GetFunction(0, "RegGetValueW")
  
  If RegGetValueW_
    
    ByteSize = 254
    
    If RegGetValueW_(#HKEY_LOCAL_MACHINE, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Appx", @"PackageRoot", #RRF_RT_REG_SZ | #RRF_SUBKEY_WOW6464KEY, 0, @buffer, @ByteSize) = #ERROR_SUCCESS
      Debug ByteSize
      Debug buffer
    EndIf
    
  EndIf
  
  CloseLibrary(0)
EndIf

Re: Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 4:26 pm
by BarryG
Thanks for the "ProgramW6432" env var! That's just what I was after. Out of curiosity, what does that show as the path on your Korean PC?

Re: Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 4:42 pm
by breeze4me
It's the same as English Windows.
C:\Program Files
See this link for other countries.
https://en.wikipedia.org/wiki/Program_Files

Re: Launching Win 10 apps from command-line

Posted: Fri Jan 01, 2021 4:48 pm
by BarryG
Thanks. And happy new year to you!