none
Process SudokuProcess = Process.Start("shell:Appsfolder\\Microsoft.MicrosoftSudoku_8wekyb3d8bbwe!App"); Warum SudokuProcess == NULL ? RRS feed

  • Frage

  • Guten Tag!

    Process SudokuProcess = Process.Start("shell:Appsfolder\\Microsoft.MicrosoftSudoku_8wekyb3d8bbwe!App");

    Beim Ausführen dieser C# Befehlszeile in Visual Studio 2015 Community Edition stoße ich auf folgendes Problem:

    SudokuProcess == NULL

    Ich benötige zu weiteren Handhabung einen hWnd (Handle) zu diesem Prozess, jedoch gibt 

    SudokuProcess.Handle

    NULL zurück.

    Woran liegt das und was kann ich da machen?

    Vielen Dank!

    Dienstag, 21. Februar 2017 21:15

Antworten

  • Hi,

    zum einen würde das nur ab Windows 8 funktionieren, Windows 7 und frühere Versionen dürften den Pfad nicht kennen.

    Zum anderen klappt das natürlich nur, wenn die Spiele überhaupt installiert sind. Bei mir bspw. nicht, daher geht der Aufruf ins Leere. Der Aufruf von Process.Start erzeugt hierbei aber wie erwartet eine Fehlermeldung "Das System kann die angegebene Datei nicht finden".

    Bei Apps scheint das Verhalten wirklich so zu sein, wie Du es beschreibst. Es wird null zurückgegeben, ich konnte das eben reproduzieren,

    Wenn man hingegen Process.Start( "notepad.exe" ) ausführt, wird der Prozess wie erwartet zurückgegeben.

    Du kannst das aber umgehen, indem Du explorer.exe mit entsprechenden Parametern startest. Das Resultat ist dasselbe (die App wird ausgeführt), Du hast aber eine Process Instanz zur weiteren Verarbeitung.

    Process SudokuProcess = Process.Start( "explorer.exe", "shell:Appsfolder\\Microsoft.MicrosoftSudoku_8wekyb3d8bbwe!App" );


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 22. Februar 2017 11:09
    Moderator
  • Hallo,

    ich denke, dass Stefans bisherige Antwort das Problem am besten getroffen hat - also warum es nicht geht.

    Es muss allerdings dennoch eine Möglichkeit geben, mit den neuartigen Windows apps zu kommunizieren.

    Die Frage ist hier, was du vor hast. Einfach irgendwie das Programm manipulieren, wie es bei Win32 möglich war, geht nicht auf gut dokumentiertem Weg, da es auch nicht vorgesehen ist. Apps sollen deutlich sicherer sein, weshalb sie auch so abgekapselt laufen.

    Viele Produktivitäts-Apps kann man mit Hilfe von Protokollen und Micro-Services Steuern. So kann man beispielsweise die Kontakte-App nutzen um in der eigenen App einen Kontakt auszuwählen. Das sind Dinge, die von den Entwicklern vorgesehen wurden und auch funktionieren.
    Weiterhin lassen sich sehr viele Apps mit einem eigenen Protokoll aufrufen. Ob Sudoku eines hat weiß ich allerdings nicht. (Beispiele zur Settings-App findest du hier)

    Zusammen gefasst:
    Eine App nach belieben zur Laufzeit verändern wird kaum möglich sein. Möglich ist für Win32 Programme allerdings einen Benutzer zu simulieren, indem man die Maus und Tastatur "fernsteuert" und auf die Bildschirmausgaben achtet.


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Mittwoch, 22. Februar 2017 13:48
    Moderator

Alle Antworten

  • Hallo GregH,

    da wird etwas mit dem Pfad nicht stimmen.

    Erzeuge Dein Handle doch zum Test einmal z.B. mit notepad.exe, und denke daran, dass c# standardmäßig keine Verbatim-String verwendet. Ein einzelner "\" ist also die Einleitung einer Escape-Sequenz.

    Grüße

    Roland 

    Dienstag, 21. Februar 2017 21:55
  • Hallo,

    was passiert denn, wenn du das was du Process.Start übergibst in der Adress-Zeile des Explorers eintippst*, kannst du die App damit starten? Bei mir klappt es unter Windows 8.1 und Windows 10.

    *Bedenke, dass du dort nur ein \ verwenden darfst.


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Dienstag, 21. Februar 2017 22:26
    Moderator
  • Hi,

    zum einen würde das nur ab Windows 8 funktionieren, Windows 7 und frühere Versionen dürften den Pfad nicht kennen.

    Zum anderen klappt das natürlich nur, wenn die Spiele überhaupt installiert sind. Bei mir bspw. nicht, daher geht der Aufruf ins Leere. Der Aufruf von Process.Start erzeugt hierbei aber wie erwartet eine Fehlermeldung "Das System kann die angegebene Datei nicht finden".

    Bei Apps scheint das Verhalten wirklich so zu sein, wie Du es beschreibst. Es wird null zurückgegeben, ich konnte das eben reproduzieren,

    Wenn man hingegen Process.Start( "notepad.exe" ) ausführt, wird der Prozess wie erwartet zurückgegeben.

    Du kannst das aber umgehen, indem Du explorer.exe mit entsprechenden Parametern startest. Das Resultat ist dasselbe (die App wird ausgeführt), Du hast aber eine Process Instanz zur weiteren Verarbeitung.

    Process SudokuProcess = Process.Start( "explorer.exe", "shell:Appsfolder\\Microsoft.MicrosoftSudoku_8wekyb3d8bbwe!App" );


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 22. Februar 2017 11:09
    Moderator
  • Hallo Roland,

    die Microsoft Sudoku App wird mit dieser Befehlszeile ordnungsgemäß ausgeführt, also der Pfad und die Anwendung sind korrekt.

    Und ja mit üblichen Windows Binaries funktioniert das ohne Probleme, diese Windows Store Apps haben allerdings keine übliche ".exe" Datei auf die man zugreifen kann, sie können nur im Kontext eines App-Containers ausgeführt werden.

    Sie haben doch allerdings auch den Vorteil sehr viel leichter durch .NET ansprechbar zu sein, man muss nur den richtigen Befehl sie aufzurufen finden.

    Mittwoch, 22. Februar 2017 13:18
  • Hallo Tom,

    "shell:Appsfolder\Microsoft.MicrosoftSudoku_8wekyb3d8bbwe!App" führt nach Eingabe in der Explorer-Adresszeile ordungsgemäß Microsoft Sudoku aus.

    Auch der von mir beschrieben Befehl in C# Visual Studio 2015 Community Edition führt Microsoft Sudoku ordnungsgemäß aus, allerdings kann ich davon keine Process Instanz speichern.

    Ich benötige eine um mit dem Programm weiter zu verfahren.

    Die neuartigen modernen .NET Apps ermöglichen das sicher mit den richtigen Befehlen.

    Mittwoch, 22. Februar 2017 13:22
  • Hallo Stefan,

    es handelt sich lediglich um eine Privatanwendung, es ist nicht notwendig diese Anwendung unter anderen Bedingungen als den meinen (Windows 10 64-bit) funktionsfähig zu machen.

    Richtig, die Windows Store Apps haben auch keine ".exe" auf die man zugreifen kann, man kann sie nur im Kontext eines App-Containers starten.

    Das ist vermutlich auch der Grund warum die Process.Start() Methode NULL zurück gibt, denn der App-Container läuft wahrscheinlich permanent im Hintergrund von Windows und führt alle App-Anfragen aus und muss daher nicht erst gestartet werden.

    Microsoft Dokumentation Process.StartInfo() :

    A new Process that is associated with the process resource, or null if no process resource is started.

    Es muss allerdings dennoch eine Möglichkeit geben, mit den neuartigen Windows Apps zu kommunizieren.

    Leider führt diese Befehlszeile bei mir nur zu dem Ergebnis, dass der Windows Explorer gestartet wird, nicht aber Microsoft Sudoku. Wenn ich richtig verstehe ist der Ansatz die App mit dem Explorer zu starten um  so eine Instanz zu erhalten.




    • Bearbeitet GregH__ Mittwoch, 22. Februar 2017 14:47
    Mittwoch, 22. Februar 2017 13:34
  • Hallo,

    ich denke, dass Stefans bisherige Antwort das Problem am besten getroffen hat - also warum es nicht geht.

    Es muss allerdings dennoch eine Möglichkeit geben, mit den neuartigen Windows apps zu kommunizieren.

    Die Frage ist hier, was du vor hast. Einfach irgendwie das Programm manipulieren, wie es bei Win32 möglich war, geht nicht auf gut dokumentiertem Weg, da es auch nicht vorgesehen ist. Apps sollen deutlich sicherer sein, weshalb sie auch so abgekapselt laufen.

    Viele Produktivitäts-Apps kann man mit Hilfe von Protokollen und Micro-Services Steuern. So kann man beispielsweise die Kontakte-App nutzen um in der eigenen App einen Kontakt auszuwählen. Das sind Dinge, die von den Entwicklern vorgesehen wurden und auch funktionieren.
    Weiterhin lassen sich sehr viele Apps mit einem eigenen Protokoll aufrufen. Ob Sudoku eines hat weiß ich allerdings nicht. (Beispiele zur Settings-App findest du hier)

    Zusammen gefasst:
    Eine App nach belieben zur Laufzeit verändern wird kaum möglich sein. Möglich ist für Win32 Programme allerdings einen Benutzer zu simulieren, indem man die Maus und Tastatur "fernsteuert" und auf die Bildschirmausgaben achtet.


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Mittwoch, 22. Februar 2017 13:48
    Moderator
  • Hallo Greg,

    auf meinen Windows 8.1 System funktioniert das wie gewünscht, bei mir allerdings mit einer anderen App (mangels installierter Spiele).

    Process myProcess = Process.Start( "explorer.exe", "shell:Appsfolder\\FileManager_cw5n1h2txyewy!Microsoft.Windows.PhotoManager" );

    Das öffnet eben den Fotomanager.

    Wenn ich das richtig lese, könnte es aber sein, dass Windows 10 bzw. eines der Updates (bspw. das Anniversary Update, welches für eine Vielzahl von Problemen bekannt ist) dir einen Strich durch die Rechnung macht.

    Schau dir mal diesen SO Thread an:

      http://stackoverflow.com/questions/39048570/unable-to-launch-windows-app-with-process-in-windows-10-anniversary-update

    Dort im letzten Beitrag findest Du eine mögliche Lösung. Kann ich nur grade nicht selbst testen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 22. Februar 2017 14:06
    Moderator
  • Um zusammenzufassen:

    -Es handelt sich lediglich um eine Privatanwendung, sie muss unter keinen anderen Bedingungen als den meinen lauffähig sein ( Windows 10 64-bit & Visual Studio 2015 Community Edition )

    -Der Aufruf dieses Dateinamens funktioniert über den Windows Explorer und führt Microsoft Sudoku aus.

    Mit "shell:Appsfolder" über das "Ausführen" Eingabefenster oder durch die Adresszeile im Windows Explorer erreicht man den Ordner in dem ausführbare Links für alle Windows Apps zu finden sind, die sonst keine ausführbaren ".exe"-Daten zur Verfügung stellen. Daran liegt denke ich auch das Problem, dass beim Aufruf der Anwendung mittels Process.Start() keine Process Instanz zurückgegeben wird.

    Im Appsfolder muss man zunächst F10 drücken um die Menuleiste sichtbar zu machen, dort auf Ansicht (ALT+A) klicken->Details auswählen... und einen Haken bei AppUserModelId machen um den aufrufbaren Namen aller Apps anzuzeigen.

    Nun noch F10 -> Ansicht (ALT+A)->Details um die AppUserModelId auch unter den Details sehen zu können.

    Mit dieser AppUserModelId kann man nun unter "shell:Appsfolder\"+AppUserModelId jede App direkt aufrufen.

    Mit der oben aufgeführten Befehlszeile gibt SudokuProcess allerdings nach Aufruf von Microsoft Sudoku NULL zurück statt einer verwendbaren Process Instanz.

    Auch der manuelle Ansatz mittels GetProcessByName

    Process SudokuProcess = new Process();
    SudokuProcess.StartInfo.FileName = "shell:Appsfolder\\Microsoft.MicrosoftSudoku_8wekyb3d8bbwe!App";
    SudokuProcess.Start();
    Thread.Sleep(10000);
    Process[] myProc;
    myProc = Process.GetProcessesByName("Microsoft Sudoku");
     

    eine nutzbare Instanz zu diesem Prozess zu bekommen scheitert daran dass kein Prozess mit diesem Namen gefunden werden kann.

    Hier ein Screenshot von der Run Time: http://imgur.com/a/qzajK






    • Bearbeitet GregH__ Mittwoch, 22. Februar 2017 14:43
    Mittwoch, 22. Februar 2017 14:40