×
Siemens Industry Online Support
Siemens AG
Beitragstyp: FAQ Beitrags-ID: 415808, Beitragsdatum: 31.07.2018
(4)
Bewerten

Wie können Sie in der WinCC / WinCC Professional Runtime das Fenster eines anderen Programms in den Vordergrund holen?

  • Beitrag
  • Betrifft Produkt(e)
Sie können mit der Windows API Funktion "FindWindow" ein Fenster mit Hilfe eines C-Skripts in den Vordergrund holen.

1) Fenster in den Vordergrund holen (C-Skript)

Auf Bediengeräten, auf denen eine WinCC PC Runtime läuft, ist häufig die Taskumschaltung gesperrt. Wenn in der Runtime Programme geöffnet werden, dann führt ein Klick auf das Fenster der Runtime dazu, dass das noch geöffnete Programm anschließend im Hintergrund hinter dem Fenster der Runtime liegt und nicht mehr aufgerufen werden kann. Mit Hilfe des im Folgenden vorgestellten C-Skriptes können Sie Fenster aus dem Hintergrund in den Vordergrund holen.
 

1.1) Die Funktion "FindWindow"

Benutzen Sie die Windows API Funktion "FindWindow" um ein Fenster in den Vordergrund zu holen:

HWND WINAPI FindWindow(LPCSTR lpClassName , LPCSTR lpWindowName);
 

1.2) Die Parameter der Funktion "FindWindow"

  • Der erste Parameter "LPCSTR lpClassName" ist der Name der Klasse des Fensters.
  • Der zweite Parameter "LPCSTR lpWindowName" ist der Titel des Fensters (Titelleiste).

Man kann entweder einen der beiden Parameter oder beide in Kombination angeben.
 

1.3) Beispiel 1:  Microsoft Access-Fenster in den Vordergrund holen

1.3.1) Ein Microsoft Access-Fenster wird mit Hilfe der Klasse in den Vordergrund geholt:

HWND Handle= NULL;
Handle= FindWindow("OMAIN",NULL);
if(Handle)
{
    ShowWindow (Handle, SW_MINIMIZE);
    ShowWindow (Handle, SW_SHOWNORMAL);
    SetForegroundWindow(Handle);    
}
else
    ProgramExecute("C:\\MSOffice.97\\Office\\ACCESS.EXE");

Wird das Fenster nicht gefunden, dann wird Microsoft Access neu gestartet.

1.3.2) Ein Microsoft Access-Fenster wird mit Hilfe des Titels in den Vordergrund geholt:

HWND Handle= NULL;
Handle=FindWindow(NULL,"Microsoft Access -");
if(Handle)
{
    ShowWindow (Handle, SW_MINIMIZE);
    ShowWindow (Handle, SW_SHOWNORMAL);
    SetForegroundWindow(Handle);    
}
else
    ProgramExecute("C:\\MSOffice.97\\Office\\ACCESS.EXE");

Wird das Fenster nicht gefunden, dann wird Microsoft Access neu gestartet.
 

1.4) Beispiel 2:  WinCC Runtime Professional-Fenster zurück in den Vordergrund holen

HWND Handle = NULL;
Handle = FindWindow("PDLRTisAliveAndWaitsForYou",NULL);
if(Handle)
{
    ShowWindow (Handle, SW_MINIMIZE);
    ShowWindow ( Handle, SW_SHOWNORMAL );
    SetForegroundWindow(Handle);
}

  

1.5) Beispiel 3:  WinCCExplorer in den Vordergrund holen (WinCC 5.x / WinCC V6.x / WinCC V7.x)

HWND Handle= NULL;
Handle= FindWindow("WinCCExplorerFrameWndClass",NULL);
if(Handle)
{
    ShowWindow(Handle, SW_MINIMIZE);
    ShowWindow ( Handle, SW_SHOWNORMAL );
    SetForegroundWindow(Handle);
}

 

2) Die Klassen häufig genutzter Programme

2.1) Microsoft Applikationen

Applikation

Name der Klasse unter

Windows 2000/XP

Name der Klasse unter

Windows 7

Name der Klasse unter
Windows 8 /
Server 2008 R2
Name der Klasse unter
Windows 10 /
Server 2012 R2

Access

OMAIN

OMAINOMAIN OMain

Internetexplorer

IEFrame

IEFrameIEFrame IEFrame

Microsoft Excel

XLMAIN

XLMAINXLMAIN XLMAIN

Microsoft Word

OpusApp

OpusAppOpusApp OpusApp

MS-DOS Eingabe-aufforderung

ConsoleWindowClass

ConsoleWindowClassConsoleWindowClassConsoleWindowClass

Notepad (Editor)

Notepad

NotepadNotepad Notepad

Paint

MSPaintApp

MSPaintAppMSPaintApp MSPaintApp

Taschenrechner

SciCalc

CalcFrameCalcFrame CalcFrame
Windows-ExplorerExploreWClassCabinetWClassCabinetWClass CabinetWClass

WordPad

WordPadClass

WordPadClassWordPadClass WordPadClass

Tabelle 01
 
  

2.2) SIMATIC Software

SIMATIC Software

Name der Klasse

Simatic Managers7tgtopx

WinCC V4.x Control Center

MCPFrameWndClass

WinCC V5.x / V6.x / V7.x WinCCExplorer

WinCCExplorerFrameWndClass

WinCC Runtime Advanced V11..14

HmiRTm

WinCC Runtime Professional V11..14

PDLRTisAliveAndWaitsForYou

Tabelle 02

 

3) Die Klasse / den Titel eines Fensters ermitteln

Wenn Sie ein nicht aufgeführtes Programm in den Vordergrund holen möchten müssen Sie zuerst den Namen der Klasse des Fensters oder den Titel des Fenster herausfinden. 

Beachten Sie bei Verwendung des Titels eines Fensters, dass sich dieser durch das Öffnen von Dokumenten ändern kann. Weiterhin ist der Titel bei manchen Programmen sprachabhängig, wodurch dann in einer anderen Sprache das Fenster evtl. nicht gefunden wird.

Die Klasse ist immer unabhängig von der Sprache. Deswegen ist es besser die Klasse eines Fensters (Parameter "lpClassName") zu verwenden.
 

3.1) Ermittlung des Titels

Den Titel eines Fensters können Sie leicht, durch Öffnen des entsprechenden Programms (ohne Dokument), herausfinden. Dieser wird Ihnen dann in der Titelleiste angezeigt.
 

3.2) Ermittlung der Klasse

Die Klasse eines Fensters können Sie zum Beispiel mit Hilfe eines Compilers herausfinden (z. B: Spy von Visual C++), oder mit Hilfe eines C-Skriptes.

Die folgenden C-Skripte ermittelt den Namen der Fensterklasse anhand des Fensternamens.
Sie können das Skript zum Beispiel an das Ereignis einer Schaltfläche anbinden um die Klasse durch Verwendung der WinCC Runtime / WinCC Runtime Professional zu ermitteln.

Beispiel 4: Ermittlung der Klasse des Fensters der "Taschenrechner"-Applikation mit WinCC

Um eine Ausgabe der "printf()"-Funktion zu erhalten, können Sie ein "GSC - Diagnose"-Applikationsfenster im WinCC-Bild verwenden oder das Programm "apdiag.exe" starten.   
 

#include "apdefap.h"
void ShowWindowClass()
{
  char WindowClass[256];
  HWND Handle = NULL;
  Handle = FindWindow(NULL, "Rechner");
  GetClassName(Handle, WindowClass, sizeof (WindowClass)-1);
  printf ("Window Class Name: %s \r\n", WindowClass);
}
 

Beispiel 5: Ermittlung der Klasse des Fensters mehrerer Applikationen mit WinCC Professional
Um eine Ausgabe der "printf()"-Funktion zu erhalten, können Sie ein "Druckauftrag/Skriptdiagnose"-Control im WinCC-Bild verwenden. Sie finden das Control in der Toolbox unter "Controls".

Die Funktion besitzt den Übergabeparameter "WindowTitle". Über den Übergabeparameter können Sie die Klassen beliebig vieler Fenster ermitteln, vorausgesetzt der jeweilige Titel ist bekannt.
Sie können auch ohne Übergabeparameter arbeiten, dann muss der Titel des Fensters, analog zu Beispiel 4, fest im Code vorgegeben werden.
 

#include "GlobalDefinitions.h"
void ShowWindowClass(char* WindowTitle)
{
  char WindowClass[256];
  HWND Handle = NULL;
  Handle = FindWindow(NULL, "WindowTitle");
  GetClassName(Handle, WindowClass, sizeof (WindowClass)-1);
  printf ("Window Title: %s", WindowTitle);
  printf (" , Window Class Name: %s \r\n", WindowClass);

 

4) Fenster dauerhaft in den Vordergrund holen

Damit die Applikation im Vordergrund bleibt, beachten Sie die folgende Einstellung in Windows 7:


Bild 01
 

Sie finden die Einstellung unter "Start > Systemsteuerung > Center für erleichterte Bedienung > Verwenden der Maus erleichtern > Verwalten von Fenstern erleichtern". Dort setzen Sie den Haken "Verhindern, dass Fenster automatisch angeordnet werden, wenn sie an den Rand des Bildschirms verschoben werden".

Ergänzende Suchbegriffe

Programmierhinweise, 2522765, 108819546, TIA Portal PC Runtime, Script, on top, Macro
Unterstützung zur Statistik
Mit dieser Funktion werden die IDs des Suchergebnisses nach gewünschter Anzahl ausgegeben (Format .txt)

Liste generieren
URL kopieren
Diese Seite in neuem Design anzeigen
mySupport Cockpit