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 ?