Seite 1 von 1

Fremdes Programm schließen

Verfasst: Do, 29. Mai 2008 21:29
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

Verfasst: Do, 29. Mai 2008 22:08
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

Verfasst: Fr, 30. Mai 2008 3:32
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

Verfasst: Fr, 30. Mai 2008 15:21
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

Verfasst: Fr, 30. Mai 2008 16:35
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 ?

Verfasst: Fr, 30. Mai 2008 16:45
von STEPHAN
genau.

wie ich ganz zum Anfang sagte ...


fremdes Programm (nicht XBAse)

Verfasst: Sa, 31. Mai 2008 19:24
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 ?