Fremdes Programm schließen

Xbase++-IDE - Workbench, Visual Xbase

Moderator: Moderatoren

Antworten
STEPHAN
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 29. Mai 2008 20:46
Hat sich bedankt: 1 Mal

Fremdes Programm schließen

Beitrag von STEPHAN »

Hallo,

ein fremdes Programm (nicht XBAse) ruft mein Programm (Xbase) auf. Ich verarbeite die nötigen Daten sende E-Mails etc.

Am Ende der erfolgreichen Verarbeitung möchte ich jetzt das aufrufende Programm schließen. Zur Zeit gebe ich auf der Tastatur ALT-F4 ein, dann landet es wieder im Hintergrund, wo es ständig läuft.

Habt Ihr irgendeinen Tip für mich, wie ich das machen kann ?

Danke

Stephan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

ich meine über API Aufrufe könnte man zuerst das Programm (die ID) aus der Liste der laufenden Programme ermitteln (über den Title). Dann müsste man an dieses Fenster die Tastendrücke senden um das Programm zu schließen.

Ich meine es wäre schon mal ein solcher Thread hier gelaufen ...

Suche nach API und TITLE (beide Begriffe erforderlich ;-) )

... nö damit findet man nichts, aber unter der Rubrik API gibt es doch so einiges, das helfen könnte:

http://www.xbaseforum.de/viewtopic.php?t=901
http://www.xbaseforum.de/viewtopic.php?t=147
http://www.xbaseforum.de/viewtopic.php?t=209
http://www.xbaseforum.de/viewtopic.php?t=238
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

hi,

icc sehe gerade
, wo es ständig läuft.
dann darf man wohl KEIN SendMessageA( nHwnd, WM_CLOSE, 0, 0 )
oder WM_QUIT senden ...
habe jetzt die WM_*.CH nicht im zugriff, aber es müsste sicherlich so was
die WM_MINIMIZE... geben.

Code: Alles auswählen


CloseNow( "TitelbarName" )

***************************

#define WM_CLOSE        0x0010
#define WM_QUIT         0x0012
#define GW_HWNDNEXT         2

#define WS_MINIMIZE         0x20000000
#define WS_MINIMIZEBOX      0x00020000

DLLFUNCTION SendMessageA( nHwnd, nCmd, wParam, lParam ) USING STDCALL FROM USER32.DLL

FUNCTION CloseNow( cNaam )
LOCAL oDlg
LOCAL aTasklist
LOCAL aSize     := { 0, 0 }
LOCAL aPos      := { 0, 0 }
LOCAL lRunnin   := .F.
LOCAL i
LOCAL nHwnd, cWind

   oDlg := XbpDialog() :new( AppDesktop(),, aPos, aSize,, .F. )
   oDlg:clipSiblings := .T.
   oDlg:drawingArea:ClipChildren := .T.
   oDlg:create()

   SETAPPFOCUS( oDlg )
   aTasklist := GetTaskList( oDlg:gethWnd( ) )

   FOR i = 1 TO LEN( aTasklist )
      cWind := TRIM( UPPER( SUBSTR( aTasklist[ i ], 9 ) ) )
      cWind := SUBSTR( cWind, 1, LEN( cWind ) - 1 )
      IF cWind == TRIM( UPPER( cNaam ) )
         lRunnin := .T.
         nHwnd := VAL( LEFT( aTasklist[ i ], 8 ) )
         SendMessageA( nHwnd, WM_CLOSE, 0, 0 ) // WM_QUIT
         RETURN lRunnin
      ENDIF
   NEXT

RETURN lRunnin

FUNCTION gettasklist( hWnd )
LOCAL aList       := {}
LOCAL cWindowName
LOCAL nVisible
   DO WHILE hWnd != 0
      cWindowname := SPACE( 100 )
      IF ( getwindowtexta( hWnd, @cWindowName, LEN( cWindowName ) ) <> 0 )
         nVisible := IsWindowVisible( hWnd )
         IF nVisible == 1
            AADD( aList, STR( hWnd, 8 ) + cWindowname )
         ENDIF
      ENDIF
      hWnd = GetWindow( hWnd, GW_HWNDNEXT )
   ENDDO
RETURN aList

FUNCTION GetWindow( hWnd, uCmd )
LOCAL nDll := DllLoad( "USER32.DLL" )
LOCAL xRet := DllCall( nDll, DLL_STDCALL, "GetWindow", hWnd, uCmd )
   DllUnLoad( nDll )
RETURN xRet

FUNCTION GetWindowTextA( hWnd, lPstring, nMax )
LOCAL nDll := DllLoad( "USER32.DLL" )
LOCAL xRet := DllCall( nDll, DLL_STDCALL, "GetWindowTextA", hWnd, @lPstring,nMax )
   DllUnLoad( nDll )
RETURN xRet

FUNCTION IsWindowVisible( hWnd )
LOCAL nDll := DllLoad( "USER32.DLL" )
LOCAL xRet := DllCall( nDll, DLL_STDCALL, "IsWindowVisible", hWnd )
   DllUnLoad( nDll )
RETURN xRet
gruss by OHR
Jimmy
STEPHAN
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 29. Mai 2008 20:46
Hat sich bedankt: 1 Mal

Beitrag von STEPHAN »

Hallo,

danke erstmal für Eure Hilfe. Also, ein WM_CLOSE funktioniert natürlich. Aber dann ist es komplett weg. Notlösung wäre es gleich wieder zu starten, dann ist es wieder im Hintergrund. Hab ich erfolgreich ausprobiert.

Es geht um eine Application, die Dateien von einem Diktiergerät runterläd und bereitstellt. Dann verarbeite ich sie weiter und versende sie.

Soas wie WM_MINIMIZE hab ich nicht gefunden, aber ich kenne mich da auch nicht gut aus.

Viele Grüße

Stephan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

STEPHAN hat geschrieben:Es geht um eine Application, die Dateien von einem Diktiergerät runterläd und bereitstellt. Dann verarbeite ich sie weiter und versende sie.
Ich vermute, dass dies keine Xbase++ Anwendung ist oder du zumindest nicht den Quellcode hast ?
Gruß
Hubert
STEPHAN
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Do, 29. Mai 2008 20:46
Hat sich bedankt: 1 Mal

Beitrag von STEPHAN »

genau.

wie ich ganz zum Anfang sagte ...


fremdes Programm (nicht XBAse)
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

hi,
STEPHAN hat geschrieben: Soas wie WM_MINIMIZE hab ich nicht gefunden, aber ich kenne mich da auch nicht gut aus.
und hast du die #define WS_MINI* mal ausprobiert ?
gruss by OHR
Jimmy
Antworten

Zurück zu „Workbench (ab 2.0), VX (bis 1.9 SL1)“