WinCC V7.0 Externes Programm beenden

matze_1001

Level-1
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo

ich möchte ein externes programm in der Runtime über ein Button beenden.

ich weiss das das irgendwie über Win-API funktionieren soll, ich sehe da aber nicht durch.

vielleicht kann mir ja jemand dabei helfen das zu bewerkstelligen.

P.S das starten habe ich hinbekommen.

mfg danke
 
P.S das starten habe ich hinbekommen.

Wie?

C / system scheidet aus, damit ist es nicht möglich den gestarteten Prozess nachträglich ausfindig zu machen. (hässliche Umwege ausgenommen)
Ich würde es mal damit versuchen:

http://www.dotnetperls.com/kill-vbnet

Code:
Module Module1
    Sub Main()
    [I]' Start the notepad.exe Process.[/I]
    Dim p As Process = Process.Start("notepad")
    Console.WriteLine("Started")

    [I]' Sleep for one second.[/I]
    Threading.Thread.Sleep(1000)

    [I]' Terminate.[/I]
    p.[U]Kill[/U]()
    Console.WriteLine("Killed")
    End Sub
End Module

 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo

danke für die antwort

also starten tu ich das programm mit einer c-aktion und ProgramExecute

ich möchte ungern den prozess beenden

lieber möchte ich es richtig beenden

das soll über PostMessage und/oder SendMessage gehen

aber wie?

mfg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Matze
Ist nicht schwer.
BigS hat auch ein Beispiel dazu.

Finden des Fenster Handle: (ob das Programm auch wirklich gestartet wurde)
http://support.automation.siemens.c...objaction=csview&extranet=standard&viewreg=WW

Beispielprogramm zum Beenden: (ungetestet Hab gerade kein WinCC zur Hand)
http://support.automation.siemens.c...=cseus&aktprim=4&extranet=standard&viewreg=WW

Ich würde Sendmessage verwenden, um festzustellen ob das Programm wirklich beendet wurde. Eventuell wird ja eine Benutzereingabe oder ähnliches erwartet. In diesem Fall musst du das Fenster wenn es dies selbst nicht tut in den Vordergrund bringen.
ShowWindow ( Handle, SW_SHOWNORMAL ) - Fenster anzeigen falls minimiert oder unsichtbar
SetForegroundWindow(Handle) - Fenster mit Fokus in den Vordergrund bringen
Grüsse Holger
 
Hallo holgermaik

ich habe mir jetzt mal die beispiele angeschaut und versucht die so anzupassen das z.B. firefox geschlossen wird aber das funst nicht wie muss ich den code anpassen?

const char* CalcWinClass = "SciCalc" ;

HWND hWnd = NULL ; // Handle to Calculator window

// Definition for Win32 API functions
#pragma code("user32.dll")
HWND FindWindow( LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);

LRESULT SendMessage( HWND hWnd, // Handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
#pragma code()



do //Close all open calculator application
{
hWnd = FindWindow( CalcWinClass , NULL ); // find calc window.
if ( hWnd )
{
printf("Calculator found ! \r\n");
SendMessage(hWnd, WM_CLOSE,0,0);
}
}
while( hWnd != NULL );

damit kann man den Calculater beenden.

mfg
 
Hallo Matze
ich nehme an das Firefox nur ein Beispiel sein soll.
Dies kann ich eben nicht machen, da ich die Class von Firefox nicht weis und gerade auch nicht feststellen kann. Habe Firefox nicht installiert. Wenn es doch Firefox ist, dann melde dich noch mal. Eventuell kann ja auch jemand aus dem Forum aushelfen der Firefox installiert hat. Die Class kann man mit Spy++ aus Visual Studio feststellen.
Ich habe dir mal ein Beispiel für den Simatic Manager gemacht und den Code etwas besser dokumentiert.

Code:
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// Definieren der Classe des gesuchten Fensters
const char* WinClass = "s7tgtopx";

// Definieren des Namens des gesuchten Fensters
const char* WinName = "SIMATIC Manager";
// Die Suche nach Namen ist bei den meisten Anwendungen nicht möglich, da in den Namen meistens noch Zusatzinformationen
// mit aufgenommen werden. In diesem Beispiel der Projektname des S7 Projektes. 

HWND hWnd = NULL ;   // Das Handle mit Null vorbesetzen

// Definieren der benötigten Win32 API Funktionen, in diesem Fall aus der "user32.dll"
#pragma code("user32.dll")

// Definieren der Funktion zum Finden des Fensterhandles 
HWND FindWindow( LPCTSTR lpClassName, // Pointer zum Suchen über Classe
             LPCTSTR lpWindowName // Pointer zum Suchen über den Namen
    );  

// Definieren der Funktion zum Senden von Nachrichten an ein Fenster
LRESULT SendMessage( HWND hWnd, // Handle des Fensters
                                                     UINT Msg, // Nachricht an das Fenster
                                                     WPARAM wParam, // Erster Parameter der Nachricht
                                                     LPARAM lParam // Zweiter Parameter der Nachricht
                                                            );
#pragma code()
// Ende der Definitionen

// Jetzt der eigentliche Aufruf der Funktion
do     
{ 
  hWnd = FindWindow( WinClass ,  NULL );    //Suche das Fenster mit der definierten Classe im Beispiel "s7gtopx"
// hWnd = Findwindow(NULL , WinName );    // Dies wäre der Aufruf wenn das Fenster über den Namen gesucht werden soll
// Eine Kombination ist auch möglich, wenn es mehrer Fenster der gleichen Classe gibt mit unterschiedlichen Namen und es soll nur ein
// bestimmtes Fenster geschlossen werden.

  if ( hWnd )                                                                // Wenn Fenster gefunden - das heist hWnd ist ungleich NULL
  {
 SendMessage(hWnd, WM_CLOSE,0,0);  // Sende an dieses Fenster die Aufforderung zum schliessen.
   }
}
while( hWnd != NULL );    // Warten bis das Fenster geschlossen wurde.
}

Wenn es eine Fremdanwendung mit Benutzereingabe ist, müsste man den Aufruf etwas anders gestallten. Durch die Schleife kann der Benutzer den Vorgang des schliessens nicht abbrechen.
Hoffe du kommst damit weiter.
Grüsse Holger

Anmerkung
Nicht alles was machbar ist, ist sinnvoll und nur ein Teil davon ist nötig!
Ich kann mir keinen Grund vorstellen, warum man eine Fremdanwendung von der man keine Struktur oder andere Infos hat, aus WinnCC heraus beenden möchte.
Besondere Vorsicht ist bei Anwendungen gegeben, die Icons im Systray ablegen oder wo die Zuordnung zu Child Fenstern nicht eindeutig ist.
 
Zuletzt bearbeitet:
Zurück
Oben