Laden...
Avatar #SAvxEvYIFf6c9BefAjNj.jpg
Benutzerbeschreibung
Hier gibt es nichts zu sehen... ;-)

Forenbeiträge von vwtyluqhuy Ingesamt 17 Beiträge

04.02.2022 - 11:45 Uhr

Danke fürs Feedback.

Ja, ist halt nicht immer alles trivial. Aber was will man machen - dran bleiben lautet die Devise.

"Im Gegensatz zu Java nimmt .NET aber nicht unbedingt auf Plattformkompatibilität Rücksicht."****

Ja, das hat aber auch seine Vorteile - OS-API-Sachen zu machen geht dann einiges einfacher als bei Java.

BTW ist mir irgendwo (VS 2019 oder auch schon bei 2017?) dass mir der Code-teil, der nicht Plattform-unabhängig ist, entsprechend markiert wurde. (Wenn ich mich nicht täusche bei der Speech-Library und bei der Prozesssteuerung?)

03.02.2022 - 10:42 Uhr

Vielen Dank... oha, wie das alles kompliziert geworden ist... vor ca. 10 Jahren konnte ich (ursprünglich Java-Entwickler) noch rein intuitiv vorgehen bei .NET - insbesondere bei C# wegen der Syntax. (Mittlerweile sind aber auch viele neue Sprachelemente hinzugekommen, welche sich klar von Java abgrenzen...)

03.02.2022 - 10:07 Uhr

-> Build ist "Debug", nicht "Release"...

Und auch in der PowerShell-Konsole seh ich rein gar nix... 😉

03.02.2022 - 10:04 Uhr

Ne, geht leider genauso wenig wie "Console...":


private void button1_Click(object sender, EventArgs e)
        {
            Debug.WriteLine("test");
            // Console.WriteLine("test"); // DOES NOT WORK!!
            // MessageBox.Show("title", "text");  // WORKS!!
        }

Kann sonst ein Video aufzeichnen Zwecks Beweis... 😉

03.02.2022 - 10:01 Uhr

Danke fürs Feedback.

"Was erwartest du denn bei einem Console.WriteLine wenn du eine GUI offen hast?"__

Dass wenn ich die Anwendung mit** cmd.exe** starte, dass mir dann was in die Konsole geloggt wird. (In meinem Fall, wenn ich auf den Button drücke -> onClick-Event halt)

Wenn ich mich nicht täusche (???) so ging das früher mal. Aber nun scheint sich dies plötzlich geändert zu haben, richtig?

03.02.2022 - 09:50 Uhr

Zwischenfrage: Habe mir jetzt mal mit VS 2019 Express eine .NET 4.8-GUI-Anwendung erstellt und nun festgestellt, dass zwar die "MessageBox" funktioniert, nicht aber Console.Write[...]:


       private void button1_Click(object sender, EventArgs e)
        {            
            Console.WriteLine("test"); // DOES NOT WORK!!
            MessageBox.Show("title", "text");  // WORKS!!
        }

Die obere Zeile verursacht

a.) Weder einen Absturz zur Laufzeit

NOCH

b.) Eine sonstige Reaktion

-> Es passiert einfach gar nichts dabei. Kommt bei einer 4.8-GUI-Anwendung die Console-Klasse gar nicht mehr zum Einsatz? Ich erinnere mich an früher als ich ein paar mal mit .NET was gemacht habe (war noch vor 2010), damals (Versionen 2.0 / 3.5) machte die Console-Klasse noch was bei einer GUI-Anwendung. Ist dies Heute scheinbar nicht mehr der Fall?

03.02.2022 - 08:51 Uhr

Oh ja, vielen Dank!! 🙂

(Trotzdem bleibe ich an dieser Stelle mal lieber bei 4.8 wegen der SpeechLib-Assembly von GitHub [welche soweit auch läuft und auf das Initialwort hört]... will mir aktuell nicht noch mehr Probleme schaffen...)

02.02.2022 - 16:46 Uhr

Danke werde mal schauen... geplant wäre eher ein Dienst, welcher im Hintergrund läuft. In Form einer Konsolenanwendung in welcher sich ne Endlosschleife "dreht". Diese soll z.B. mit https://nssm.cc/ zu einem Dienst gemacht werden

02.02.2022 - 16:33 Uhr

@T-Virus: M.E. nicht wirklich: Edit: Bild entfernt.

Konsolenanwendung: "[...] die mit .NET Core unter [...]"

Klassenbibliothek: "[...] für .NET Standard oder .NET Core"

...aber wer weiss, vielleicht ist dies bei VS 2022 wieder anders?

Und die 4.x-Version habe ich ja extra geladen damit ich bei VS 2017 Express unter dem Projekteinstellungen die Version 4.8 wählen kann.

EDIT: "Warum 4.0?"

Sry. meinte 4.x... konkret 4.8 😉

02.02.2022 - 16:29 Uhr

-> Vielleicht (NUR "vielleicht"?) könnte man GitHub - Zoomicon/SpeechLib: Library for Speech Synthesis and Recognition using Windows.Speech or Microsoft.Speech and optionally Kinect V1 Sensor Microphone Array auch für das Core / 5.0-Framework kompilieren - dessen bin ich mir aber nicht 100% sicher und bleibe aus diesem Grund mal lieber bei v4.0...

02.02.2022 - 16:21 Uhr

**Nachtrag: **Da ich https://github.com/Zoomicon/SpeechLib verwende, muss ich leider noch auf dem 4.x-Framework bleiben... wie mir aufgefallen ist, kann VS 2019 für Anwendungen nur noch .NET Core / 5.0-Anwendungen generieren. (Scheint aber nicht für Assemblies zu gelten - mit VS 2019 kann man immer noch z.B. für das .NET Framework 4.x Assemblies erstellen - frage mich gerade, ob dies nur für die Express-Version gilt oder ob dem generell so sei - halt auch bei den kostenpflichtigen Versionen...?)

Alles in allem geht es darum: Es soll eine Sprachsteuerung erstellt werden, welche a.) Über ein vordefiniertes "Initialwort" mithilfe von GitHub - Zoomicon/SpeechLib: Library for Speech Synthesis and Recognition using Windows.Speech or Microsoft.Speech and optionally Kinect V1 Sensor Microphone Array den Browser mit einer best. URL startet, oder, falls dieser bereits gestartet ist, einen Browser-Refresh veranlasst (darum geht's ja im Thread)... nach dem Start oder Refresh der Browsers wird ein Client-seitiger Code aufgerufen, welcher die Browser-Sprachsteuerung (mithilfe von GitHub - TalAter/annyang: Speech recognition for your site ) in Gang setzt. (GitHub - TalAter/annyang: Speech recognition for your site in einer Endlos-Schleife zu starten funktioniert nicht wirklich, scheint "non-blocking" zu sein was das Ganze drunter und drüber geraten lässt) Wenn der Browser mithilfe dieses JS-Codes dann ein Wort erkannt hat, soll er einen Webservice per AJAX (oder SJAX?) aufrufen in der Art http://localhost/speechservice.php?word=ERKANNTES_WORT

02.02.2022 - 15:06 Uhr

Hallo M.L.

Vielen Dank für das schnelle Feedback! 🙂

Bei mir will es noch nicht so ganz - deshalb noch 2 Fragen:

1.) Was bedeutet das ´@´ vor dem String?

2.) Verstehst du unter "naiv kompiliert" wohl eher "nativ kompiliert" was heisst als CPU-Plattform nicht mehr "any", sondern "x64" (oder ggf. x86) zu wählen?

02.02.2022 - 11:07 Uhr

Ich meine HIER wird's relativ offensichtlich, dass chrome.exe nur 1x gestartet ist - ganz im Ggs. zum anderen rot markierten Prozess...

Et volià:Edit: Bild entfernt.

02.02.2022 - 11:03 Uhr

FRAGE: Wie kann ein Prozess (als .exe-Datei) nur 1x gestartet sein, aber mehrere Prozess-IDs inne haben?

// Edit: Bild entfernt

P.S.: Und wie fügt man hier [externe] Bilder ein??

02.02.2022 - 10:49 Uhr

Oder könnte es sein, dass das obere Beispiel (unter simulating-key-press-c-sharp ) doch das "bessere" (m.E. eher weniger?) ist?


static class Program
{
    [DllImport("user32.dll")]
    public static extern int SetForegroundWindow(IntPtr hWnd);

    [STAThread]
    static void Main()
    {
        while(true)
        {
            Process [] processes = Process.GetProcessesByName("iexplore");

            foreach(Process proc in processes)
            {
                SetForegroundWindow(proc.MainWindowHandle);
                SendKeys.SendWait("{F5}");
            }

            Thread.Sleep(5000);
        }
    }
}

(Natürlich ohne die Schleife für meinen konkreten Anwendungsfall...😉)

02.02.2022 - 10:47 Uhr

Hallo zusammen

folgender Code liegt vor, funktioniert allerdings nicht. (Quelle: simulating-key-press-c-sharp ):


using System;

using System.Linq;



using System.Diagnostics;
using System.Management;
using System.Runtime.InteropServices;
using System.Threading;

namespace SendKeyPress
{
    class Program
    {
        private static string lChromeProcessNameWithExtension = "chrome.exe";

        private static string mExecutablePath = "C:/Program Files/Google/Chrome/Application/" + lChromeProcessNameWithExtension;

        private static bool lUseChromium = true;

        static Program()
        {
            if(lUseChromium)
            {
                mExecutablePath = "C:/Users/user1/AppData/Local/Chromium/Application/" + lChromeProcessNameWithExtension;
            }
        }        

        private static String convertToWindowsPathFormat(string str)
        {
            str = str.Replace("/", "\\");
            return str;
        }

        private static void writeEmpyLine()
        {
            Console.Write("\r\n");
        }

        private Program(string[] args)
        {
            if(args[0].Trim().Length == 0)
            {
                Console.WriteLine("URL was not set...");
                return;
            }

            mExecutablePath = Program.convertToWindowsPathFormat(Program.mExecutablePath);

            string lParameters = args[0];

            string lExecutablePathWithParameters = mExecutablePath + " " + lParameters;

            writeEmpyLine();

            Console.WriteLine("Command line: " + lExecutablePathWithParameters);
           
            /////////////////////////////////////////////////////////////////////
            Process[] lProcessArr = Program.getProcesses();
            
            string lChromeProcessName = lChromeProcessNameWithExtension.Substring(0, lChromeProcessNameWithExtension.Length - 4);

            Boolean lProcessIsStarted = false;

            Process lProcess = null;

            for (int lCnt = 0; lCnt < lProcessArr.Length; lCnt++)
            {
                lProcess = lProcessArr[lCnt];
                string lProcessName = lProcess.ProcessName;

                if (lProcessName.Contains(lChromeProcessName))
                {
                    string lProcessExecutablePath = Program.getProcessPath(lProcess.Id);

                    if (lProcessExecutablePath.Equals(mExecutablePath))
                    {
                        lProcessIsStarted = !lProcessIsStarted;

                        if (lProcessIsStarted)
                        {
                            break;
                        }
                    }                       
                }

            }
            /////////////////////////////////////////////////////////////////////

            writeEmpyLine();            

            if (!lProcessIsStarted)
            {
                Program.startProcess(args);
            }
            else
            {
                string lProcessExecutablePath = Program.getProcessPath(lProcess.Id);               

                if (lProcessExecutablePath.Equals(mExecutablePath))
                {
                    Console.WriteLine("Process '" + lChromeProcessNameWithExtension + "' is already started - do a website refresh...");
                    ProcessControl.sendKeyPress(lProcess.Id);
                }
                else
                {
                    Program.startProcess(args);
                }
            }
        }

        private static void startProcess(String[] args)
        {
            Console.WriteLine("Process '" + lChromeProcessNameWithExtension + "' is not started yet - will start now...");
            Process.Start(mExecutablePath, args[0]);
        }

        private static Process[] getProcesses()
        {
           return Process.GetProcesses();
        }

        static void Main(string[] args)
        {
            if(args == null)
            {
                args = new string[0];
            }

            if(args.Length == 0)
            {
                Console.WriteLine("No command line parameters set");
                return;
            }

            new Program(args);
        }




        private static string getProcessPath(int processId)
        {
            string MethodResult = "";

            try
            {
                string Query = "SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId;

                using (ManagementObjectSearcher mos = new ManagementObjectSearcher(Query))
                {
                    using (ManagementObjectCollection moc = mos.Get())
                    {
                        string ExecutablePath = (from mo in moc.Cast<ManagementObject>() select mo["ExecutablePath"]).First().ToString();
                        MethodResult = ExecutablePath;
                    }

                }

            }
            catch (Exception lException)
            {
                Console.WriteLine(lException.Message);
            }

            return MethodResult;
        }
    }
}

static class ProcessControl
{
    const UInt32 WM_KEYDOWN = 0x0100;
    const int VK_F5 = 0x74;

    [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

    [STAThread]
    public static void sendKeyPress(int processID)
    {
        // Console.WriteLine(processID);
        Process proc = Process.GetProcessById(processID);            
        PostMessage(proc.MainWindowHandle, VK_F5, VK_F5, 0);                                
    }
}

Weiss jemand weiteres zum Thema? Könnte es evtl. daran liegen, dass das Fenster von 'chrome.exe' (Chrome oder Chromium) nicht fokussiert ist? Besten Dank für die Feedbacks.