Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Fremdes Programm schließen

Xbase++-IDE - Workbench, Visual Xbase

Moderator: Moderatoren

Antworten
STEPHAN
UDF-Programmierer
UDF-Programmierer
Beiträge: 80
Registriert: Do, 29. Mai 2008 20:46

Fremdes Programm schließen

Beitrag von STEPHAN » Do, 29. Mai 2008 21:29

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: 13908
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Beitrag von brandelh » Do, 29. Mai 2008 22:08

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: 10747
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Beitrag von AUGE_OHR » Fr, 30. Mai 2008 3:32

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
UDF-Programmierer
UDF-Programmierer
Beiträge: 80
Registriert: Do, 29. Mai 2008 20:46

Beitrag von STEPHAN » Fr, 30. Mai 2008 15:21

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: 13908
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Beitrag von brandelh » Fr, 30. Mai 2008 16:35

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
UDF-Programmierer
UDF-Programmierer
Beiträge: 80
Registriert: Do, 29. Mai 2008 20:46

Beitrag von STEPHAN » Fr, 30. Mai 2008 16:45

genau.

wie ich ganz zum Anfang sagte ...


fremdes Programm (nicht XBAse)

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10747
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Beitrag von AUGE_OHR » Sa, 31. Mai 2008 19:24

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