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.
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?
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...?)
Du kannst auch in anderen Versionen mit .NET Framework arbeiten.
Selbst in VS 2022 kannst du das noch.
Das wird auch vermutlich noch einige Versionen lang supportet.
Mit Express o.ä. hat das nicht viel zu tun.
Liegt einfach daran, dass .NET Framework halt noch supportet wird seitens MS.
Auch wenn .NET 5/6 die bessere Wahl sind, wird auch MS nicht übernacht für ein supportetes Produkt alles absägen.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Warum 4.0?
Das dürfte schon lange abgekündigt sein bzw. hat keinen Support mehr von MS.
Spring lieber erstmal auf 4.8, dass wird vermutlich noch ein paar Jahre support haben.
Dann kannst du auch ohne Probleme deine .NET 4.0 Verweise etc. verwenden.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Zus. zu 1.): im konkreten Fall braucht man @ nicht, aber längerfristig ist es die solidere Entscheidung
2.) das "t" fehlt absichtlich: VS starten, WinForms-Projekt anlegen, Program.cs öffnen, gegebenen Quellcode kopieren, "Debug" und "Any CPU" belassen, alles speichern, Run-Button. Und kurz danach auf der Kommadozeile mit geöffnetem (oder geschlossenem) Chromebrowser experimentieren (<- evtl. waren andere Vorgehensweisen geplant)
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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von vwtyluqhuy am .
@vwtyluqhuy
Dann scheinst du nicht richtig zu gucken bzw. scroll doch mal runter.
Die ganzen Projekte für Framework haben i.d.R. ein "(.NET Framework)" im Namen.
Kann ich sowohl in VS 2019 als auch 2022 sehen und auswählen.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
(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...)
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?
Was erwartest du denn bei einem Console.WriteLine wenn du eine GUI offen hast?
Wenn du in die Debug Console von VS schreiben willst, musst du Debug.WriteLine verwenden.
"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?
Für die PowerShell bzw. cmd musst du den "Output type" deiner Anwendung auf "Console Application" stellen.
Rechtsklick aufs Projekt -> Properties -> Application -> Output type
Es öffnet sich dann aber auch ein zusätzliches Konsolenfenster wenn du die Anwendung per Doppelklick startest.
Edit: Ob es noch andere Nachteile gibt, musst du selbst recherchieren.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dannoe am .
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...)
(teilweise offtopic) Der gezeigte Quellcode funktioniert auch ohne Umwege über z.B. PowerShell oder zusätzliche (ältere) Befehle, siehe Anhang.
Im Gegensatz zu Java nimmt .NET aber nicht unbedingt auf Plattformkompatibilität Rücksicht. Es kann also passieren, dass man auf Codes oder Vorgehensweisen trifft, die damals möglich (wenn auch nicht zwingend sinnvoll) waren. Aber diese sind angesichts neuerer Änderungen, Entwicklungen, Erweiterungen,... obsolet (geworden), bekanntere Beispiele sind "(Un)Boxing" vs. "Generics" oder der neue(re) Umgang mit Zeiten.
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?)