"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Visual Basic !?

bBU.CyTrobIc 09.05.2002 - 16:40 1017 14
Posts

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
hoi,

mal ne kleine frage...

programme starten kann ich... aber nicht wieder beenden :/

ich will ein programm beenden was ich vorher gestartet hab. zb. so:

basic proggi1 -> starten t-online und beendet sich wieder
basic proggi2 -> beendet t-online

wie realisier ich das ?

thx cy

(starten geht, aber wie zum geier beende ich das wieder?)

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Window suchen (per Class oder Titel) mit EnumWindows oder FindWindow

und

ein WM_CLOSE schicken...

xTixo

Master of Trinity
Avatar
Registered: Jan 2002
Location: 1150.vie.at
Posts: 535
Wenns in einem Project sind kannst eigentlich auch die andere Form einfach invisible machen... So hab ichs gemacht, halte es aber für pfusch;) und programmier nicht mehr in VB :D :rolleyes:

FMFlash

tranceCoder
Avatar
Registered: Mar 2001
Location: Wien
Posts: 2037
statt visible = false würd ich eher unload verwenden ...

xTixo

Master of Trinity
Avatar
Registered: Jan 2002
Location: 1150.vie.at
Posts: 535
Form1.unload - so gechreibt?

FMFlash

tranceCoder
Avatar
Registered: Mar 2001
Location: Wien
Posts: 2037
Zitat von xTixo
Form1.unload - so gechreibt?

Unload Me

Zitat von bBU.CyTrobIc
hoi,

mal ne kleine frage...

programme starten kann ich... aber nicht wieder beenden :/

ich will ein programm beenden was ich vorher gestartet hab. zb. so:

basic proggi1 -> starten t-online und beendet sich wieder
basic proggi2 -> beendet t-online

wie realisier ich das ?

thx cy

(starten geht, aber wie zum geier beende ich das wieder?)

aber um zum eigentlichen problem zu kommen: ich würd an deiner stelle ein steuerprog schreiben das das geschwünschte prog startet / beendet

dazu brauchst du nur ein kontrollwindow mit (in meinem beispiel hier 3 buttons - starten / checken / beenden (als bsp wird notepad gestartet und beendet)) und ein zusätzliches modul

in das modul schreibst du folgendes:
------------------------------
Option Explicit

' hier die benötigten API-Deklarationen
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As _
Long, ByVal dwProcessId As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" _
(ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Const STILL_ACTIVE = &H103
Const PROCESS_ALL_ACCESS = &H1F0FFF
Const PROCESS_TERMINATE = &H1

' Prüfen, ob ein Task mit einer bestimmten
' TaskID noch aktiv ist
Public Function IsTaskActive(lTaskID As Long) As Boolean
Dim lhwnd As Long
Dim lExitCode As Long

lhwnd = OpenProcess(PROCESS_ALL_ACCESS, False, lTaskID)
Call GetExitCodeProcess(lhwnd, lExitCode)
Call CloseHandle(lhwnd)

IsTaskActive = (lExitCode = STILL_ACTIVE)
End Function

' Task beenden
Public Sub TerminateTask(lTaskID As Long)
Dim lhwnd As Long
Dim lResult As Long

lhwnd = OpenProcess(PROCESS_TERMINATE, 0&, lTaskID)
lResult = TerminateProcess(lhwnd, 1&;)
lResult = CloseHandle(lhwnd)
End Sub


und der code des kontrollfensters:
---------------------------------

Option Explicit

' TaskID des von uns gestarteten Windows-Editor
Private lTaskID As Long

Private Sub cmdStart_Click()
' Notepad starten
Dim sWinPath As String

sWinPath = Environ("WinDir")
If Right$(sWinPath, 1) <> "\" Then _
sWinPath = sWinPath & "\"

lTaskID = Shell(sWinPath & "notepad.exe", vbNormalFocus)
End Sub

Private Sub cmdCheck_Click()
' Prüfen, ob das von uns gestartete Notepad
' noch läuft
If IsTaskActive(lTaskID) Then
MsgBox "Notepad wird noch ausgeführt!"
Else
MsgBox "Notepad wurde bereits beendet!"
End If
End Sub

Private Sub cmdExit_Click()
' Die von uns gestartete Notepad-Instant
' beenden
If IsTaskActive(lTaskID) Then
TerminateTask lTaskID
MsgBox "Notepad wurde geschlossen."
Else
MsgBox "Notepad wird nicht mehr ausgeführt!"
End If
End Sub


und schon hast du ein kleines tool mit dem du beliebig programme starten/beenden kannst

hoffentlich das was du brauchst :)

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
ok danke schonmal für die vielen antworten, mein problem ist nur das das ganze remote über php ausgeführt wird...

d.h. ich habe keine möglichkeit die TaskID zu bestimmen.

der soll T-Online beeden, weiss da einer was ?

thx cy

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
was ist mit der antwort vom that?

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
Zitat
was ist mit der antwort vom that?

ehrlich gesagt hab ich wenig plan von VB und weiss nicht wie er das meint :D bzw. wie ich das code-mässig umsetzen soll :(

cy

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Ungefähr so, nur halt in VB:

Code:
// closewnd.cpp - close specified windows

#include <windows.h>
#include <string.h>
#include <stdio.h>

static const char Helptext[] = 
 "Window close utility, (c)that2001\n\n"
 "Syntax: closewnd <window title>\n";
                  
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
  LPCSTR pszTitle = (LPCSTR) lParam;

  char sz[200];
  GetWindowText(hwnd, sz, sizeof(sz));
  if (IsWindowVisible(hwnd) && strstr(_strlwr(sz), pszTitle)) {
//    printf("%s\n", sz);
    PostMessage(hwnd, WM_CLOSE, 0, 0);
  }

  return TRUE;
}


int main(int argc, char **argv)
{
  if (argc < 2) {
    printf(Helptext);
    return 1;
  }

  _strlwr(argv[1]);
  EnumWindows(EnumProc, (LPARAM) argv[1]);
  return 0;
}

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Hier das Executable, falls jemand keinen Compiler hat... (1,2 kB)
closewnd_7849.zip (downloaded 65x)

bBU.CyTrobIc

#include "billrulz.h"
Avatar
Registered: Oct 2000
Location: Hamburg
Posts: 1875
hmm könnt mir das jemand in VB übersetzen ? ich bin zu blöd zum milchholen :D

thx cy

btw. thx dir schonmal that

FMFlash

tranceCoder
Avatar
Registered: Mar 2001
Location: Wien
Posts: 2037
wozu noch übersetzen? kannst ja auch direkt das executable von ihm benutzen :)

ps: in vb is für die selbe aufgabe ein so **** umständlicher und langwieriger code zu schreiben ... *graus*

Bimminger

christoph-bimminger.at
Avatar
Registered: Nov 2001
Location: Linz
Posts: 684
in vb mit SendKeys das {F4} an das Fenster mit window-title "T-Online" oder so senden. is zwar äusserst unsauber aber IT WORXX

JC

Administrator
Disruptor
Avatar
Registered: Feb 2001
Location: Katratzi
Posts: 9067
Zitat von Bimminger
in vb mit SendKeys das {F4} an das Fenster mit window-title "T-Online" oder so senden. is zwar äusserst unsauber aber IT WORXX
Dafür gibt's die tollen WM_xxx-Messages via API ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz