Ich habe eine Anwendung mit einem Hauptformular zugreifen. Wenn Sie die Anwendung öffnen, verbirgt ein AutoExec-Makro die Anwendung über die Windows API apiShowWindow. Dann öffnet das AutoExec das Hauptformular, das auf Popup festgelegt ist. Das alles funktioniert wunderbar; Meine Datenbank-Eingeweide sind versteckt und das Formular öffnet sich und schwebt einfach mit.Access Application, ausgeblendete Anwendung Fenster mit Formular Taskleiste Icon
Wenn jedoch die Access-Datenbank ausgeblendet wird, verlieren Sie das Taskleistensymbol. Ich habe ein benutzerdefiniertes Symbol in der Einstellung Optionen \ Aktuelle Datenbank \ Anwendungssymbol festgelegt. Wenn ich die Datenbank nicht ausgeblendet habe, wird dieses Symbol in der Taskleiste angezeigt.
Ich habe eine API-Problemumgehung gefunden, die ein Symbol in der Taskleiste nur für das Formular anzeigen wird. Es geht ein bisschen so etwas:
Public Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function SetWindowPos Lib "user32" _
(ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long) As Long
Public Sub AppTasklist(frmHwnd)
Dim WStyle As Long
Dim Result As Long
WStyle = GetWindowLong(frmHwnd, GWL_EXSTYLE)
WStyle = WStyle Or WS_EX_APPWINDOW
Result = SetWindowPos(frmHwnd, HWND_TOP, 0, 0, 0, 0, _
SWP_NOMOVE Or _
SWP_NOSIZE Or _
SWP_NOACTIVATE Or _
SWP_HIDEWINDOW)
Result = SetWindowLong(frmHwnd, GWL_EXSTYLE, WStyle)
Debug.Print Result
Result = SetWindowPos(frmHwnd, HWND_TOP, 0, 0, 0, 0, _
SWP_NOMOVE Or _
SWP_NOSIZE Or _
SWP_NOACTIVATE Or _
SWP_SHOWWINDOW)
End Sub
Dieser Ansatz funktioniert; Ich erhalte ein Symbol in der Taskleiste, das nur dem Formular zugewiesen ist. Das Symbol in der Taskleiste ist jedoch das Standardzugriffssymbol.
Als Antwort auf dieses Problem, fügte ich eine anderen API-Aufruf der SendMessageA mit:
öffentlich Declare Function SendMessage32 Lib "user32" Alias _ "SendMessageA" (ByVal hWnd As Long, ByVal WMSG As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long
so ausgeführt:
Private Const WM_SETICON = &H80
Private Const ICON_SMALL = 0&
Private Const ICON_BIG = 1&
Dim icoPth As String: icoPth = CurrentProject.Path & "\MyAppIcon.ico"
Dim NewIco As Long: NewIco = ExtractIcon32(0, icoPth, 0)
Dim frmHwnd As Long: frmHwnd = Me.hwnd 'the form's handle
SendMessage32 frmHwnd, WM_SETICON, ICON_SMALL, NewIco
SendMessage32 frmHwnd, WM_SETICON, ICON_BIG, NewIco
SendMessage32 hWndAccessApp, WM_SETICON, ICON_SMALL, NewIco
SendMessage32 hWndAccessApp, WM_SETICON, ICON_BIG, NewIco
Beachten Sie, dass ich die oben genannten vier Zeilen von "SendMessages" in verschiedenen Aufträgen innerhalb und außerhalb, oben und unten der AppTaskliste Sub vergeblich versucht habe.
Es scheint auf der Anwendungsebene zu funktionieren, aber es scheint nie auf der Formularebene zu funktionieren.
Für diejenigen von Ihnen vertraut mit dieser besonderen Zwangslage, lassen Sie mich einige der anderen Optionen außerhalb von VBA auflisten, die ich ausprobiert habe.
1.) Taskleiste \ Eigenschaften \ Taskleistenschaltflächen. Ich habe diese Menüoption auf "Nie kombinieren" und "Kombinieren, wenn die Taskleiste voll ist" geändert. Also, im Prinzip funktioniert das. Ich bekomme jetzt mein Icon nur für den Ordner und das kleine Label. ABER (!), Funktioniert es nur, wenn die Benutzer diese Einstellungen an ihrem Ende überprüft haben. Meiner Erfahrung nach verwendet fast niemand eine der Optionen außer "Immer kombinieren, Labels ausblenden".
2.) Ändern der Registrierungseinstellungen. Sie können den folgenden Registrierungsschlüssel ändern, um das Standardsymbol zu ändern, das eine Anwendung verwendet: "HKEY_CLASSES_ROOT \ Access.Application.14 \ DefaultIcon (Default)". Die meisten Benutzer (ich selbst eingeschlossen) haben jedoch keinen Zugriff auf den Teil HKEY_CLASSES_ROOT der Registrierung. Außerdem müsste ich einen Code schreiben, um den richtigen Schlüssel zu finden und ihn dann zu ändern (was ich tun könnte), aber es ist unklar, ob diese Änderung sofort erfolgen würde - ganz zu schweigen davon, dass ich sie beim Verlassen der Anwendung.
3.) Klicken Sie mit der rechten Maustaste auf die angeheftete Anwendung, und klicken Sie dann mit der rechten Maustaste auf die Anwendung, um ein Eigenschaftsmenü mit einer Schaltfläche namens "Symbol ändern ..." auf der Registerkarte "Verknüpfung" aufzurufen. Für ein Programm wie Access ist diese Schaltfläche jedoch ausgegraut.
Ich verwende Windows 7 und Access 2010.
Ist es möglich, das Taskbar-Symbol im obigen Szenario auf etwas anderes als das Standard-Access-Symbol zu erzwingen?
Ich habe das Gefühl, es gibt Äther ein bisschen etwas, das ich vermisse, oder eine API-Funktion, die verwendet werden könnte, oder eine bessere SendMessage-Konstante, oder das, vielleicht, kann es einfach nicht gemacht werden.
Jede Hilfe würde sehr geschätzt werden.
Auch als Disclaimer (ich denke): offensichtlich wurde der obige Code von anderen Beiträgen aus diesem Forum und anderen gezogen. Das meiste davon wurde nicht angegeben, woher ich es habe. Ich habe einige kleinere Tweeks gemacht, damit es in Access funktioniert, im Gegensatz zu dem anderen Teil von Microsoft Software, der immer in meinen Suchergebnissen erscheint, also werde ich es hier nicht nennen.
Danke!