Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 10 von 10

Thema: WinCC V7.0 Externes Programm beenden

  1. #1
    Registriert seit
    30.06.2011
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren WinCC V7.0 Externes Programm beenden  

  2. #2
    Registriert seit
    29.04.2012
    Beiträge
    195
    Danke
    13
    Erhielt 42 Danke für 37 Beiträge

    Standard

    Zitat Zitat von matze_1001 Beitrag anzeigen
    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()
        ' Start the notepad.exe Process.
        Dim p As Process = Process.Start("notepad")
        Console.WriteLine("Started")
    
        ' Sleep for one second.
        Threading.Thread.Sleep(1000)
    
        ' Terminate.
        p.Kill()
        Console.WriteLine("Killed")
        End Sub
    End Module

    There are two kinds of fools. One says, “This is old, and therefore good.” And one says, “This is new, and therefore better.”

  3. #3
    matze_1001 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.06.2011
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  4. #4
    Registriert seit
    25.02.2010
    Beiträge
    618
    Danke
    35
    Erhielt 121 Danke für 110 Beiträge

    Standard

    Hallo
    Über WM_Close als Sendmessage kannst du eine Programmbeendigung anfordern. (Nicht erzwingen)
    Info

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms632617%28v=vs.85%29.aspx


    Unbedingt die Antwort auswerten.
    Grüsse Holger

  5. #5
    matze_1001 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.06.2011
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    hallo

    ds ist wohl eine nummer zu groß für mich

    kannst du mir mal ein beispiel mit dem firefox schreiben?

    mfg

  6. #6
    Registriert seit
    25.02.2010
    Beiträge
    618
    Danke
    35
    Erhielt 121 Danke für 110 Beiträge

    Standard

    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.co...ard&viewreg=WW

    Beispielprogramm zum Beenden: (ungetestet Hab gerade kein WinCC zur Hand)
    http://support.automation.siemens.co...ard&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

  7. #7
    matze_1001 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.06.2011
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  8. #8
    Registriert seit
    25.02.2010
    Beiträge
    618
    Danke
    35
    Erhielt 121 Danke für 110 Beiträge

    Standard

    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.
    Geändert von holgermaik (27.12.2013 um 15:42 Uhr) Grund: Anmerkung angefügt

  9. #9
    matze_1001 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.06.2011
    Beiträge
    11
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    hallo

    vielen dank für deine mühe

    aber ich habe mich jetzt endschieden das programm normal zu beenden

    mfg

  10. #10
    Registriert seit
    25.02.2010
    Beiträge
    618
    Danke
    35
    Erhielt 121 Danke für 110 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Halte ich für ein Produktivsystem für eine sehr gute Entscheidung.
    Grüsse Holger

Ähnliche Themen

  1. WinCC MP277 Runtime automatisch beenden
    Von TomDrom im Forum HMI
    Antworten: 1
    Letzter Beitrag: 26.07.2013, 14:14
  2. WinCC 7.0 - in Runtime sicher beenden
    Von CanYouHelpMe im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 10.09.2009, 10:37
  3. WinCC-Runtime beenden
    Von Anonymous im Forum HMI
    Antworten: 1
    Letzter Beitrag: 12.09.2005, 14:01
  4. Antworten: 0
    Letzter Beitrag: 31.08.2005, 14:17
  5. WinCC über Batch-File komplett beenden?
    Von S7_Mich im Forum HMI
    Antworten: 10
    Letzter Beitrag: 18.10.2004, 14:35

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •