70_WINCONNECT.pm zum Steuern eines Windows PC / Tablet

Begonnen von michael.winkler, 19 Oktober 2016, 10:08:42

Vorheriges Thema - Nächstes Thema

the ratman

ungetestete, dumme idee:

keine ahnung, ob win das zulässt?
das script in einem verzeichnis bei fhem ablegen, dieses für windoof freigeben und übers netz dann in win aufrufen.
→do↑p!dnʇs↓shit←

vbs

Die Idee ist gut! Zumindest besser als alles andere bisher, danke!

Eine andere Idee, um sozusagen eine Art Datei zu übertragen (ich weiß aber nicht, ob das praktiabel ist für ernsthafte Scripte):
set wz_pcBase command cmd /c echo "mein script inhalt" > C:\test.bat

TWART016

Zitat von: vbs am 14 Dezember 2020, 23:15:17
Eine Frage habe ich jedoch auch:
Ich brauche eine minimal komplexe Logik (Programm starten + Audio Device umstellen + Display umschalten etc.), was ich gerne in ein Powershell-Script packen würde. Was ist der sauberste Ansatz dafür? Momentan habe ich das Shell-Script auf dem Rechner hinterlegt und starte es dann aus FHEM mit "set $device commandhide powershell -file $remoteScript". Das setzt jedoch voraus, dass das Script auf dem Rechner liegt und bei Änderungen muss es immer auf dem Rechner selbst geändert werden.
Daran werde ich in den nächsten Tagen auch sein. Display deaktivieren/spiegeln/erweitern und Audio Gerät umstellen. Hatte da bisher Tools im Blick, welche das über Profile lösen können. Wie sieht denn dein Powershell Skript auf?

Ich habe das mit Skripten bisher so gelöst:
- zentrale Skripte auf NAS / Cloud-Speicher / USB an Fritzbox / ...
- Synchronisierung der Skripte mit den Sync Client auf den Windows PCs
- Starten der Skripte

Die Skripte sind so klein und so oder so auf meinem PC, daher ist es mir egal, dass die dort liegen.

vbs

Benutze momentan dafür nircmd und multimontool. Mein Script sieht so aus:
Param ($command)

# Needs once as admin:
# Install-Module VirtualDesktop

$playniteExe = "C:\Playnite\Playnite.DesktopApp"
$nircmdExe = "C:\Program Files\nircmd\nircmd.exe"
$multiMonExe = "C:\Program Files\nircmd\MultiMonitorTool.exe"

$soundDevicePc      = "Kopfhörer"
#$soundDeviceSteam   = "AVR" #"LG TV"
$soundDeviceSteam   = "LG TV"
$displayPc          = "\\.\DISPLAY2"
$displaySteam       = "\\.\DISPLAY3"

$desktopName = "Playnite"

function EnableDisplay {
    Param($display)
    Start-Process $multiMonExe -ArgumentList "/enable", $display
}

function DisableDisplay {
    Param($display)
    Start-Process $multiMonExe -ArgumentList "/disable", $display
}

function SetPrimaryDisplay {
    Param($display)
    Start-Process $multiMonExe -ArgumentList "/SetPrimary", $display
}

function SetSoundDevice {
    Param($deviceName)
    Start-Process $nircmdExe -ArgumentList "setdefaultsounddevice `"$deviceName`""
}

function Start-Playnite {
    Write-Output "Starting playnite..."
    Start-Process $playniteExe
}

function Stop-Playnite {
    Write-Output "Stopping playnite..."
    $proc = Get-Process Playnite.FullscreenApp
    $proc.CloseMainWindow()
}

if($command -eq "steam") {
    EnableDisplay $displaySteam
    Start-Sleep -Seconds 4
    SetPrimaryDisplay $displaySteam
    SetSoundDevice $soundDeviceSteam
    Start-Sleep -Seconds 1
    New-Desktop | Switch-Desktop
    Start-Sleep -Seconds 1
    Stop-Playnite
    Start-Playnite
}
elseif ($command -eq "test") {
    Add-Type -AssemblyName System.Windows.Forms
    [System.Windows.Forms.MessageBox]::Show("Script executed","Test",0)
}
elseif ($command -eq "pc") {
    Stop-Playnite
    SetSoundDevice $soundDevicePc
    SetPrimaryDisplay $displayPc
    DisableDisplay $displaySteam

    # remove last desktop
    Remove-Desktop
}
else {
    Write-Output "Unknown command: '$command'"
}



Bin aber interessiert, wenn es da noch andere/bessere Lösungen gibt. Was benutzt du denn?

Bin mittlerweile auch davon weg, die Scripte in FHEM drin haben zu wollen. Da es eh noch weitere Abhängigkeiten gibt (zB nircmd/multimontool), ist das dann wohl eh immer recht spezielle auf den Rechner zugeschnitten. Für Powershell muss man dann auch evtl. einmalig weitere Module installieren.

TWART016

Zitat von: vbs am 23 Dezember 2020, 13:53:49
Benutze momentan dafür nircmd und multimontool. Mein Script sieht so aus:
Param ($command)

# Needs once as admin:
# Install-Module VirtualDesktop

$playniteExe = "C:\Playnite\Playnite.DesktopApp"
$nircmdExe = "C:\Program Files\nircmd\nircmd.exe"
$multiMonExe = "C:\Program Files\nircmd\MultiMonitorTool.exe"

$soundDevicePc      = "Kopfhörer"
#$soundDeviceSteam   = "AVR" #"LG TV"
$soundDeviceSteam   = "LG TV"
$displayPc          = "\\.\DISPLAY2"
$displaySteam       = "\\.\DISPLAY3"

$desktopName = "Playnite"

function EnableDisplay {
    Param($display)
    Start-Process $multiMonExe -ArgumentList "/enable", $display
}

function DisableDisplay {
    Param($display)
    Start-Process $multiMonExe -ArgumentList "/disable", $display
}

function SetPrimaryDisplay {
    Param($display)
    Start-Process $multiMonExe -ArgumentList "/SetPrimary", $display
}

function SetSoundDevice {
    Param($deviceName)
    Start-Process $nircmdExe -ArgumentList "setdefaultsounddevice `"$deviceName`""
}

function Start-Playnite {
    Write-Output "Starting playnite..."
    Start-Process $playniteExe
}

function Stop-Playnite {
    Write-Output "Stopping playnite..."
    $proc = Get-Process Playnite.FullscreenApp
    $proc.CloseMainWindow()
}

if($command -eq "steam") {
    EnableDisplay $displaySteam
    Start-Sleep -Seconds 4
    SetPrimaryDisplay $displaySteam
    SetSoundDevice $soundDeviceSteam
    Start-Sleep -Seconds 1
    New-Desktop | Switch-Desktop
    Start-Sleep -Seconds 1
    Stop-Playnite
    Start-Playnite
}
elseif ($command -eq "test") {
    Add-Type -AssemblyName System.Windows.Forms
    [System.Windows.Forms.MessageBox]::Show("Script executed","Test",0)
}
elseif ($command -eq "pc") {
    Stop-Playnite
    SetSoundDevice $soundDevicePc
    SetPrimaryDisplay $displayPc
    DisableDisplay $displaySteam

    # remove last desktop
    Remove-Desktop
}
else {
    Write-Output "Unknown command: '$command'"
}


Was macht das Skript genau?


Zitat von: vbs am 23 Dezember 2020, 13:53:49
Bin aber interessiert, wenn es da noch andere/bessere Lösungen gibt. Was benutzt du denn?

Bin mittlerweile auch davon weg, die Scripte in FHEM drin haben zu wollen. Da es eh noch weitere Abhängigkeiten gibt (zB nircmd/multimontool), ist das dann wohl eh immer recht spezielle auf den Rechner zugeschnitten. Für Powershell muss man dann auch evtl. einmalig weitere Module installieren.
Ich habe mir in den letzten Tagen ein paar Tools für die Fensterverwaltung angesehen. DisplayFusion und Actual Window Manager sind ziemlich mächtig, kosten aber auch einiges. Zu einem endgültigen Ergebnis bin ich aber noch nicht gekommen.
UltraMon hat mir mit den Profilen auf den ersten Blick sehr gut gefallen. Die Profile können per Datei ausführen gewechselt werden.

Somit kann man ohne großes Skripting sich seine Profile per GUI erstellen und dann einfach nur aus FHEM ausrufen.
Bei Audio habe ich bisher (außer den beiden Bezahllösungen) auch nur nircmd gefunden. Dafür muss man meine ich aber nur ein Befehl ausführen, was über das Modul sicherlich möglich ist.

vbs

Das Script ruft man entweder mit Parameter "pc" oder mit Parameter "steam" auf. Je nachdem wird dann das SoundDevice und das Display entsprechend umgeschaltet. Bei "steam" wird außerdem das Programm "Playnite" gestartet und ein neuer virtueller Desktop erstellt und auf diesen umgeschaltet.

Per

Ich wollte die Sendkey funktion nutzen, das funktioniert prinzipiell auch. ABER: wie kombiniere ich zwei Tasten ([Crtl] + "X")? Dafür habe ich weder hier noch bei MS Infos gefunden.

Apropos Microsoft, den im Changelog aufgelisteten Link konnte ich zwar aufrufen, aber er gab mir keine sinnvolle Seite zurück.

Zitat von: michael.winkler am 19 Oktober 2016, 10:08:42
Changelog

#               [WinWebGUI] - sendKey https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731.aspx


Fündig bin ich dagegen hier geworden. Leider auch ohne meine oben angeführten Fragen zu beantworten.
https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

Falkenstein

Das würde mich auch interessieren,eine Kombination aus zwei Tasten zu senden ([Crtl] + "X").

Ist das überhaupt möglich? Ich konnte dazu auch nichts finden.


Hat da jemand ein Beispiel?

Beste Grüße
Falkes

michael.winkler

schaut mal hier
https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.sendkeys.send?view=net-5.0

Um anzugeben, dass eine beliebige Kombination von Shift, STRG und Alt gedrückt bleiben soll, während mehrere andere Tasten gedrückt werden, schließen Sie den Code für diese Schlüssel in Klammern ein. Um beispielsweise anzugeben, dass die UMSCHALTTASTE gedrückt werden soll, während E und C gedrückt werden, verwenden Sie "+ (EC)". Um anzugeben, dass die UMSCHALTTASTE gedrückt werden soll, während E gedrückt wird, gefolgt von C ohne Shift, verwenden Sie "+ EC".
Verwenden Sie das Format {Key Number}, um sich wiederholende Schlüssel anzugeben. Sie müssen ein Leerzeichen zwischen Schlüssel und Zahl platzieren. {Left 42} bedeutet beispielsweise, dass die nach-links-Taste 42 Mal gedrückt wird. {h 10} bedeutet, h 10-Mal zu drücken.

Falkenstein

Um anzugeben, dass eine beliebige Kombination von Shift, STRG und Alt gedrückt bleiben soll, während mehrere andere Tasten gedrückt werden, schließen Sie den Code für diese Schlüssel in Klammern ein. Um beispielsweise anzugeben, dass die UMSCHALTTASTE gedrückt werden soll, während E und C gedrückt werden, verwenden Sie "+ (EC)". Um anzugeben, dass die UMSCHALTTASTE gedrückt werden soll, während E gedrückt wird, gefolgt von C ohne Shift, verwenden Sie "+ EC".
Verwenden Sie das Format {Key Number}, um sich wiederholende Schlüssel anzugeben. Sie müssen ein Leerzeichen zwischen Schlüssel und Zahl platzieren. {Left 42} bedeutet beispielsweise, dass die nach-links-Taste 42 Mal gedrückt wird. {h 10} bedeutet, h 10-Mal zu drücken.


Das mit den Klammern und "+" funktioniert alles nicht in WINCONNECT. Man kann nur einen numerischen Key senden zum Beispiel für "F5" dann "0x74". Aber mit den numerischen Keys geht keine Kombination aus mehren Tasten.Ich habe es bis jetzt nicht geschafft.Und darüber habe ich auch nichts gefunden.

Per

Zitat von: michael.winkler am 12 Februar 2021, 16:18:53
schaut mal hier
https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.sendkeys.send?view=net-5.0
Bei der Übersetzung rollen sich einem ja die Fußnägel hoch!
Im englischen Original sieht das deutlich besser aus! Aber funktionieren tut es trotzdem nicht :(

Der Quelltext von 70_WINCONNECT.pm hilft auch nicht weiter, da werden nur Spaces durch %20 ersetzt (interessanterweise durch eine for-Schleife statt RegEx-Replace).

michael.winkler

Zitat von: Per am 12 Februar 2021, 19:55:05
Bei der Übersetzung rollen sich einem ja die Fußnägel hoch!
Im englischen Original sieht das deutlich besser aus! Aber funktionieren tut es trotzdem nicht :(

Der Quelltext von 70_WINCONNECT.pm hilft auch nicht weiter, da werden nur Spaces durch %20 ersetzt (interessanterweise durch eine for-Schleife statt RegEx-Replace).
Ist schon etwas her wo ich diese Modul erstellt habe. Heute würde ich es auch anders machen.

Ich schaue mir das mit den SendKeys mal in der Programmierung an. Komme da aber erst nächste Woche dazu.

Per

Zitat von: michael.winkler am 14 Februar 2021, 12:37:39Heute würde ich es auch anders machen.
Ich auch, statt Sendkey [win] + L habe ich eine DLL gestartet ;).
Damit hat das für mich keine Prio mehr.

Per

Gleicht mal noch eine Frage an die Schwarmintelligenz: ich bräuchte eine wiederkehrende Tätigkeit als Admin. Direkt (set command(hide)) bekomme ich das nicht hin, aber ich könnte über geplante Tasks was auslösen. Aber welcher Trigger wäre machbar?
Oder wäre das als Dienst direkt möglich?

Falkenstein

Ist schon etwas her wo ich diese Modul erstellt habe. Heute würde ich es auch anders machen.

Ich schaue mir das mit den SendKeys mal in der Programmierung an. Komme da aber erst nächste Woche dazu.



Ich habe daran nach wie vor sehr großes Interesse,da ich dieses Modul sehr intensiv nutze.


Beste Grüße
Falkes