Fremdes Programm schließen
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 116
- Registriert: Do, 29. Mai 2008 20:46
- Hat sich bedankt: 1 Mal
Fremdes Programm schließen
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
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
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
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
icc sehe gerade
oder WM_QUIT senden ...
habe jetzt die WM_*.CH nicht im zugriff, aber es müsste sicherlich so was
die WM_MINIMIZE... geben.
icc sehe gerade
dann darf man wohl KEIN SendMessageA( nHwnd, WM_CLOSE, 0, 0 ), wo es ständig läuft.
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
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 116
- Registriert: Do, 29. Mai 2008 20:46
- Hat sich bedankt: 1 Mal
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
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