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