Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
936to940
936to940
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Laufende Anwendung ermitteln und beenden
20.12.2007 11:47:00
Oliver
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


6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufende Anwendung ermitteln und beenden
20.12.2007 18:14:37
Ramses
Hallo
WIE schliesst du denn ?
Probiers mal mit
myHwnd.Terminate
Gruss Rainer

AW: Laufende Anwendung ermitteln und beenden
20.12.2007 20:26:11
Oliver
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

Anzeige
AW: Laufende Anwendung ermitteln und beenden
20.12.2007 20:36:55
Fred
Hi,
falsches Forum, versuchs mal in einem VB-Forum.
mfg Fred

AW: Laufende Anwendung ermitteln und beenden
20.12.2007 21:20:00
Oliver
Habe die Antwort selbst gefunden
mit SendMessage myHwnd, WM_SYSCOMMAND, SC_CLOSE, LNULL kann der Explorer geschlossen werden
Gruß
Oliver Breith

AW: Laufende Anwendung ermitteln und beenden
20.12.2007 20:55:01
Oliver
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

AW: Laufende Anwendung ermitteln und beenden
20.12.2007 21:21:04
Fred
Hi,
"...- ich weiss, dass es hier um VBA geht -- ..."
Eben nicht, dein Code ist VB, nicht VBA!
mfg Fred
Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige