Suche Funktion "ControlGetFocus"
Hallo zusammen,
ich bin auf der Suche nach der Funktion "ControlGetFocus", welche aus AutoIT stammt, für powershell.
Derzeit mache ich eine Abfrage, ob das gewünschte Programm überhaupt aktiv ist:
Kann jedoch an Notepad keine Befehle senden, wenn es nicht aktiv ist.
Jemand eine Idee? (Uwe bestimmt =))
Gruß, Sascha
ich bin auf der Suche nach der Funktion "ControlGetFocus", welche aus AutoIT stammt, für powershell.
Derzeit mache ich eine Abfrage, ob das gewünschte Programm überhaupt aktiv ist:
IF (!$syncHash.Cancel){
$FindProg = Get-Process | Where-Object {$_.Name -eq 'notepad++'}
[Microsoft.VisualBasic.Interaction]::AppActivate($FindProg.ID)
IF (!$?){
[System.Windows.Forms.MessageBox]::Show('Programm nicht gefunden', 'Abbruch', 0)
$syncHash.Cancel = $true
Kann jedoch an Notepad keine Befehle senden, wenn es nicht aktiv ist.
Jemand eine Idee? (Uwe bestimmt =))
Gruß, Sascha
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 253148
Url: https://administrator.de/contentid/253148
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
3 Kommentare
Neuester Kommentar
Hallo Sascha,
für solche Sachen gibt es eine PS-Bibliothek die solche Aufgaben wesentlich erleichtert, wenn du nicht mit den Win32-API Funktionen rum hantieren willst:
http://uiautomation.codeplex.com/
Beispiele wie du damit umgehst findest du hier
Grüße Uwe
für solche Sachen gibt es eine PS-Bibliothek die solche Aufgaben wesentlich erleichtert, wenn du nicht mit den Win32-API Funktionen rum hantieren willst:
http://uiautomation.codeplex.com/
Beispiele wie du damit umgehst findest du hier
Grüße Uwe
Zitat von @SaschaRD:
Hatte es bereits mit Bibliothek von UIAutomation versucht, hatte jedoch dasselbe Ergebnis. Sobald ich woanders hingeklickt habe und der Fokus nicht mehr im Notepad war, wurde die durchgeführte Aktion / das durchgeführte Event im derzeit aktiven Fenster ausgeführt.
dann hast du die Bibliothek nicht richtig verwendet, das geht mit der Bibliothek auch ohne das das Fenster im Vordergrund sein muss !Hatte es bereits mit Bibliothek von UIAutomation versucht, hatte jedoch dasselbe Ergebnis. Sobald ich woanders hingeklickt habe und der Fokus nicht mehr im Notepad war, wurde die durchgeführte Aktion / das durchgeführte Event im derzeit aktiven Fenster ausgeführt.
Alternativ schick es über die Win32 Funktionen direkt an das Control, dann ist es auch egal ob das Fenster den Fokus hat oder nicht .
Hier ein Beispiel das einen Text an ein parallel geöffnetes Notepad-Fenster schickt, egal ob es den Fokus hat oder nicht...
function init() {
[String]$SourceCode = @"
Imports System
Imports System.String
Namespace colinardo
Public Class MyFunctions
Private Declare Auto Function FindWindowEx Lib "user32.dll" (ByVal hwndParent As IntPtr,ByVal hwndChildAfter As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
Private Declare Auto Function SendMessage Lib "user32.dll" (hWnd As IntPtr, Msg As UInt32, wParam As IntPtr, lParam As System.Text.StringBuilder) As IntPtr
Public Shared Function SetTextInControl(wHandle as System.IntPtr,control as String, strText as String) as boolean
Dim sb As New System.Text.StringBuilder(strText)
Dim controlHwnd As IntPtr = FindWindowEx(wHandle, System.IntPtr.Zero, control, Nothing)
if not controlHwnd = System.IntPtr.Zero then
SendMessage(controlHwnd, &HC, sb.Length, sb)
return true
end if
return false
End Function
End Class
End Namespace
"@
add-type -TypeDefinition $SourceCode -Language VisualBasic
}
init
$notepadHandle = (Get-Process -Name "notepad" -ErrorAction SilentlyContinue | select -First 1).MainWindowHandle
if ($notepadHandle){
[colinardo.MyFunctions]::SetTextInControl($notepadHandle,"Edit","Das ist ein Test")
}else{
write-host "Kein Notepad-Fenster gefunden, bitte erst eins öffnen..." -ForegroundColor Red
}
Grüße Uwe