Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Suche Funktion "ControlGetFocus"

Frage Entwicklung Batch & Shell

Mitglied: SaschaRD

SaschaRD (Level 1) - Jetzt verbinden

27.10.2014 um 14:08 Uhr, 1159 Aufrufe, 3 Kommentare

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:
01.
IF (!$syncHash.Cancel){ 
02.
$FindProg = Get-Process | Where-Object {$_.Name -eq 'notepad++'} 
03.
[Microsoft.VisualBasic.Interaction]::AppActivate($FindProg.ID)						 
04.
IF (!$?){ 
05.
[System.Windows.Forms.MessageBox]::Show('Programm nicht gefunden', 'Abbruch', 0) 
06.
$syncHash.Cancel = $true
Kann jedoch an Notepad keine Befehle senden, wenn es nicht aktiv ist.

Jemand eine Idee? (Uwe bestimmt =))

Gruß, Sascha
Mitglied: colinardo
27.10.2014, aktualisiert um 14:34 Uhr
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
Bitte warten ..
Mitglied: SaschaRD
27.10.2014 um 15:00 Uhr
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:
01.
$Notepad = WinWaitActive("[CLASS:Notepad++]") 
02.
$NotepadFocus = ControlGetFocus($Notepad) 
03.
 
04.
While 1 
05.
ControlSend($Notepad, Default, $NotepadFocus,"Test ") 
06.
Sleep (2000) 
07.
WEnd
Mein Beispiel mit einer (sinnlosen) Endlos-Schleife.

Gruß, Sascha
Bitte warten ..
Mitglied: colinardo
27.10.2014, aktualisiert um 16:10 Uhr
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 .

Hier ein Beispiel das einen Text an ein parallel geöffnetes Notepad-Fenster schickt, egal ob es den Fokus hat oder nicht...
01.
function init() { 
02.
    [String]$SourceCode = @" 
03.
Imports System 
04.
Imports System.String 
05.
Namespace colinardo     
06.
    Public Class MyFunctions 
07.
        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 
08.
        Private Declare Auto Function SendMessage Lib "user32.dll" (hWnd As IntPtr, Msg As UInt32, wParam As IntPtr, lParam As System.Text.StringBuilder) As IntPtr 
09.
         
10.
        Public Shared Function SetTextInControl(wHandle as System.IntPtr,control as String, strText as String) as boolean 
11.
            Dim sb As New System.Text.StringBuilder(strText) 
12.
            Dim controlHwnd As IntPtr = FindWindowEx(wHandle, System.IntPtr.Zero, control, Nothing) 
13.
            if not controlHwnd = System.IntPtr.Zero then 
14.
                SendMessage(controlHwnd, &HC, sb.Length, sb) 
15.
                return true 
16.
            end if 
17.
            return false 
18.
        End Function 
19.
         
20.
    End Class 
21.
End Namespace 
22.
"@ 
23.
 add-type -TypeDefinition $SourceCode -Language VisualBasic 
24.
25.
init 
26.
 
27.
$notepadHandle = (Get-Process -Name "notepad" -ErrorAction SilentlyContinue | select -First 1).MainWindowHandle 
28.
if ($notepadHandle){ 
29.
    [colinardo.MyFunctions]::SetTextInControl($notepadHandle,"Edit","Das ist ein Test") 
30.
}else{ 
31.
    write-host "Kein Notepad-Fenster gefunden, bitte erst eins öffnen..." -ForegroundColor Red 
32.
}
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...