saschard
Goto Top

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:
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

Content-Key: 253148

Url: https://administrator.de/contentid/253148

Printed on: April 24, 2024 at 22:04 o'clock

Member: colinardo
colinardo Oct 27, 2014 updated at 13:34:36 (UTC)
Goto Top
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
Member: SaschaRD
SaschaRD Oct 27, 2014 at 14:00:18 (UTC)
Goto Top
Hallo Uwe,

Danke für deinen Input.

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.

Bisher habe ich es nur mit AutoIT geschafft, einen Fokus auf ein gewünschtes Fenster zu legen:
$Notepad = WinWaitActive("[CLASS:Notepad++]")  
$NotepadFocus = ControlGetFocus($Notepad)

While 1
ControlSend($Notepad, Default, $NotepadFocus,"Test ")  
Sleep (2000)
WEnd

Mein Beispiel mit einer (sinnlosen) Endlos-Schleife.

Gruß, Sascha
Member: colinardo
colinardo Oct 27, 2014 updated at 15:10:30 (UTC)
Goto Top
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 !

Alternativ schick es über die Win32 Funktionen direkt an das Control, dann ist es auch egal ob das Fenster den Fokus hat oder nicht face-wink.

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  
}
In das Thema musst du dich leider erst intensiver einlesen, AutoIT macht auch nichts anderes als diese Win32-Funktionen zu verwenden, um Nachrichten an Fenster und Controls zu schicken .

Grüße Uwe