Mam aplikację dostępową z jednym głównym formularzem. Po uruchomieniu aplikacji makro AutoExec ukrywa aplikację za pomocą apiShowWindow interfejsu API systemu Windows. Następnie AutoExec otwiera główny formularz ustawiony na Popup. Wszystko działa pięknie; moje wnętrze bazy danych jest ukryte, a formularz otwiera się i po prostu pływa.Aplikacja dostępu, okno aplikacji ukrytej z formularzem Ikona paska Ikona
Jednak, gdy baza danych dostępu zostanie ukryta, stracisz ikonę na pasku zadań. Mam niestandardowy zestaw ikon w ustawieniach Opcje \ Bieżąca baza danych \ Ikona aplikacji. Jeśli nie ukrywam bazy danych, ta ikona wyświetla się poprawnie na pasku zadań.
Znalazłem obejście interfejsu API, które po prostu pokazuje ikonę na pasku zadań. Trochę to brzmi:
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
To podejście działa; Dostaję ikonę na pasku zadań poświęconą tylko formie. Jednak ikona na pasku zadań jest standardową ikoną dostępu.
W odpowiedzi na ten problem, dodałem kolejne wywołania API używając SendMessageA:
Declare Public Function SendMessage32 Lib "user32" Alias _ "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) dopóki
Wykonane w ten sposób:
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
Należy pamiętać, że wypróbowałem powyższe cztery wiersze "SendMessages" w różnych zamówieniach wewnątrz i na zewnątrz, na górze i na dole AppTasklist Sub bezskutecznie.
Wygląda na to, że działa na poziomie aplikacji, ale nigdy nie działa na poziomie formularza.
Dla tych, którzy znają ten konkretny kłopot, proszę wymienić kilka innych opcji poza VBA, które próbowałem.
1.) Pasek zadań \ Właściwości \ Przyciski na pasku zadań. Zmieniłem tę opcję menu na "Nigdy nie łącz" i "Łącz, gdy pasek zadań jest pełny". Zasadniczo to działa; Teraz otrzymuję ikonę tylko dla folderu i małej etykiety. ALE (!) Działa tylko wtedy, gdy użytkownicy mają sprawdzone ustawienia po ich zakończeniu. Z mojego doświadczenia prawie nikt nie korzysta z żadnej z opcji, z wyjątkiem opcji "Zawsze łącz, ukryj etykiety".
2.) Zmiana ustawień rejestru. Możesz zmienić następujący klucz rejestru, aby zmienić domyślną ikonę używaną przez aplikację: "HKEY_CLASSES_ROOT \ Access.Application.14 \ DefaultIcon (domyślnie)." Jednak większość użytkowników (łącznie ze mną) nie ma dostępu do części rejestru HKEY_CLASSES_ROOT. Co więcej, musiałbym napisać jakiś kod, aby znaleźć właściwy klucz, a następnie go zmienić (co mogłem zrobić), ale nie jest jasne, czy ta zmiana byłaby natychmiastowa - nie wspominając, że musiałbym ją zmienić przy wyjściu z podanie.
3.) Kliknięcie prawym przyciskiem myszy przypiętej aplikacji, a następnie kliknięcie prawym przyciskiem myszy aplikacji w menu daje menu właściwości z przyciskiem "Zmień ikonę ..." w zakładce "Skrót". Jednak w przypadku programu takiego jak Access ten przycisk jest wyszarzony.
Używam systemu Windows 7 i Access 2010.
Czy można wymusić ikonę paska zadań w powyższym scenariuszu na coś innego niż standardowa ikona dostępu?
Mam wrażenie, że jest tam coś, czego mi brakuje lub funkcja API, której można użyć, lub lepsza stała SendMessage, lub, być może, po prostu nie da się tego zrobić.
Każda pomoc zostanie bardzo doceniona.
Ponadto, jako zrzeczenie się (jak sądzę): oczywiście powyższy kod został pobrany z innych postów z tego forum i innych. Większość tego była nieosiągalna, skąd ją dostałem. Wprowadziłem kilka drobnych tweeksów, aby działały w programie Access, w przeciwieństwie do innych elementów oprogramowania Microsoft, które wciąż znajdują się w moich wynikach wyszukiwania, więc nie wymienię ich tutaj.
Dzięki!