Microsoft Excel

Herbers Excel/VBA-Archiv

Laufende Anwendung ermitteln und beenden

Betrifft: Laufende Anwendung ermitteln und beenden von: Oliver Breith
Geschrieben am: 20.12.2007 11:47:40

Hallo Spezialisten,

ich sitze einmal wieder an einem kleinen Problem:
Ich möchte gerne einen "Advanced Explorer" basteln, welcher über das Systray erreichbar ist und voreinstellbare Verzeichnisse hat.
Problem:
ein zuletzt geöffnete Explorer soll auf Wunsch anhand der Titel-Leiste erkannt werden und eventuell geschlossen werden. Der Explorer wird zwar über hWnd gefunden, aber das Schießen klappt nicht

Ich habe den Ursprungs-Code unter
http://www.wer-weiss-was.de/theme161/article3531332.html#3531332
gefunden und erweitert. Nun hänge ich aber etwas bei meiner Erweiterung:

ich habe euch hier meinen gesamten Code gepostet, ihr braucht nur eine leere Form1.frm mit einem Button cmdHide und ein Modul1
in der Form1 ist ein Menu welches wie folgt aufgebaut ist:
mnuMenuPopUp; Caption: Menüeinstellungen; visible=false
mnuOptions (Index=0); Caption: Optionen ändern; visible = true
mnuEinstellungen (Index 0); Caption: weiteren Explorer starten; visible = true
mnuPopup(Indexe 1 bis 6); Caption: keine (wird mit den Code gemacht); visible = true

des weiteren eine Ini-Datei (Einstellungen.ini) welche wie folgt aufgebaut ist:

es stehen einfach die Einträge der beforzugten Verzeichnisse darin
z.B.

c:\windows
c:\
C:\Dokumente und Einstellungen

Hier mein Code

Form-Code:



Private Sub cmdHide_Click()
  ' Symbol der Anwendung zum SysTray hinzufügen
  ' dieser Code wird nicht benötigt
  With nid
    .cbSize = Len(nid)
    .hWnd = Me.hWnd
    .uId = vbNull
    .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    .uCallBackMessage = WM_MOUSEMOVE
    .hIcon = Me.Icon
    .szTip = Me.Caption & vbNullChar
  End With
  Shell_NotifyIcon NIM_ADD, nid
  
  ' Anwendung jetzt "verstecken"
  Me.Hide
End Sub





Private Sub Form_Load()
    With nid
    .cbSize = Len(nid)
    .hWnd = Me.hWnd
    .uId = vbNull
    .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    .uCallBackMessage = WM_MOUSEMOVE
    .hIcon = Me.Icon
    .szTip = Me.Caption & vbNullChar
  End With
  Shell_NotifyIcon NIM_ADD, nid
  Open App.Path & "\Einstellungen.ini" For Input As #1
  Zeile = 0
  Do Until EOF(1)
  Zeile = Zeile + 1
  Line Input #1, Linetemp
  mnuPopup(Zeile).Caption = Linetemp
  Loop
  ' Anwendung jetzt "verstecken"
  Me.Hide
End Sub





Private Sub Form_MouseMove(Button As Integer, _
  Shift As Integer, X As Single, Y As Single)
  
  ' Das MouseMove Ereignis wird ausgelöst, wenn die
  ' Maus über das Symbol im Systray geführt wird

  Dim lMsg As Long
  Dim sFilter As String
  
  lMsg = X / Screen.TwipsPerPixelX
  Select Case lMsg
     Case WM_LBUTTONDOWN
      ' linke Maustaste wird gedrückt
      
     Case WM_LBUTTONUP
      ' linke Maustaste wird losgelassen
      
     Case WM_LBUTTONDBLCLK
      ' linke Maustaste - Doppelklick
      
     Case WM_RBUTTONDOWN
      ' rechte Maustaste wird gedrückt
      
     Case WM_RBUTTONUP
       ' rechte Maustaste wird losgelassen
       ' (jetzt z.B. Popup-Menü öffnen)
       PopupMenu MenuPopUp
       
     Case WM_RBUTTONDBLCLK
      ' rechte Maustaste - Doppeklick
      
  End Select
End Sub





Private Sub Form_Unload(Cancel As Integer)
  ' Symbol aus dem Systray entfernen, wenn das Programm beended wird
  Shell_NotifyIcon NIM_DELETE, nid
End Sub





Private Sub mnuEinstellungen_Click(Index As Integer)
'checkbox umschalten
If mnuEinstellungen(0).Checked = True Then
    mnuEinstellungen(0).Checked = False
Else
    mnuEinstellungen(0).Checked = True
End If
End Sub





Private Sub mnuOptions_Click(Index As Integer)
    Shell ("c:\windows\notepad.exe " & App.Path & "\Einstellungen.ini"), 1
End Sub





Private Sub mnuPopUp_Click(Index As Integer)
  ' Symbol aus dem Systray entfernen
  'Shell_NotifyIcon NIM_DELETE, nid 'habe ich abgestellt
  If mnuEinstellungen(0).Checked = False Then
      'explorer schießen
        Call KillApp(LCase(geöffnete_Anwendung))
        Shell ("C:\WINDOWS\explorer.exe /n," & mnuPopup(Index).Caption), vbNormalFocus
        geöffnete_Anwendung = LCase(mnuPopup(Index).Caption)
    Else
  Shell ("C:\WINDOWS\explorer.exe /n," & mnuPopup(Index).Caption), vbNormalFocus
  geöffnete_Anwendung = LCase(mnuPopup(Index).Caption)
  End If
  PopupMenu MenuPopUp 'schaltet Popup wieder ab
End Sub



Modul Code

' API zum Anwendung finden/aktivieren
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As Long) As Long

Private Declare Function FindWindowEx Lib "user32" Alias _
"FindWindowExA" (ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Declare Function GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hWnd As Long, _
ByVal lpString As String, ByVal cch As Long) As Long

Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const WM_CLOSE = 16



Public Function KillApp(Titel As String)
Dim myHwnd As Long, MyCaption As String
    
    myHwnd = FindWindowEx(0, 0, vbNullString, vbNullString)
    Do While myHwnd
        MyCaption = String(255, 0)
        GetWindowText myHwnd, MyCaption, 255
        If InStr(1, LCase(MyCaption), LCase(geöffnete_Anwendung)) Then 'geöffnete Anwendung  _
schließen
            SendMessage myHwnd, WM_CLOSE, 0, 0 'hier ist mein Problem , da der  _
Explorer   nicht   geschlossen wird      
  End If
    myHwnd = FindWindowEx(0, myHwnd, vbNullString, vbNullString)
    Loop
End Function


  

Betrifft: AW: Laufende Anwendung ermitteln und beenden von: Ramses
Geschrieben am: 20.12.2007 18:14:37

Hallo

WIE schliesst du denn ?
Probiers mal mit

myHwnd.Terminate

Gruss Rainer


  

Betrifft: AW: Laufende Anwendung ermitteln und beenden von: Oliver Breith
Geschrieben am: 20.12.2007 20:26:11

Hallo Rainer,
ich schiesse die Anwendung mit "SendMessage myHwnd, WM_CLOSE, 0, 0". Dein Vorschlag mit myHwnd.terminate führt zu Fehler Ungültiger Bezeichner

Ich habe es einmal ausprobiert, wenn ich die aktuelle Titelzeile direkt in den Code einzugeben
z.B. Call KillApp("C:\WINDOWS") ---wenn im Explorer das Verzeichnis "C:\WINDOWS" geöffnet ist
das führt zu einem "Bing" (Windows ton).

Probiere ich dieses mit einer Datei die in Notepad geöffnet ist z.B. Call KillApp("eula.txt") so klappt das einwandfrei --- es muss irgendwie am Explorer liegen

Hast Du einen Idee?

Gruß aus Lörrach

Oliver Breith


  

Betrifft: AW: Laufende Anwendung ermitteln und beenden von: Fred
Geschrieben am: 20.12.2007 20:36:55

Hi,

falsches Forum, versuchs mal in einem VB-Forum.

mfg Fred


  

Betrifft: AW: Laufende Anwendung ermitteln und beenden von: Oliver Breith
Geschrieben am: 20.12.2007 21:20:12

Habe die Antwort selbst gefunden

mit SendMessage myHwnd, WM_SYSCOMMAND, SC_CLOSE, LNULL kann der Explorer geschlossen werden


Gruß

Oliver Breith


  

Betrifft: AW: Laufende Anwendung ermitteln und beenden von: Oliver Breith
Geschrieben am: 20.12.2007 20:55:01

Hallo Fred,

danke für deine Info - ich weiss, dass es hier um VBA geht -- mache ich auch meistens. Aber hier tummeln sich so vieeele Profis, desshalb habe ich hier gepostet. Ich probiere es auch noch in einem VB-Forum.


Gruß

Oliver Breith


  

Betrifft: AW: Laufende Anwendung ermitteln und beenden von: Fred
Geschrieben am: 20.12.2007 21:21:04

Hi,



"...- ich weiss, dass es hier um VBA geht -- ..."



Eben nicht, dein Code ist VB, nicht VBA!



mfg Fred


 

Beiträge aus den Excel-Beispielen zum Thema "Laufende Anwendung ermitteln und beenden "