2014-10-27 44 views
6

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!

Odpowiedz

2

OK. Więc zamierzam odpowiedzieć na moje własne pytanie. Najwyraźniej wszystko czego naprawdę potrzebowałem, to przerwa od akcji i wypisanie mojego problemu. Niedługo po tym, jak napisałem to pytanie, wróciłem na konia i wypróbowałem więcej terminów wyszukiwania. W końcu natknąłem się na stanowisko, które na początku nie wydawało się owocne, ponieważ nie było dla mnie jasne, czy plakat i ja mieliśmy do czynienia z tym samym scenariuszem.

znalazłem moją odpowiedź tutaj:

http://www.access-programmers.co.uk/forums/showthread.php?t=231422

Po pierwsze, aplikacja musi otworzyć za pomocą skrótu. Na szczęście dla mnie używam skrótu na pulpicie od samego początku.

Kiedy zacząłem budować aplikację, od samego początku wiedziałem, że będę używał skryptu VBScript do instalacji aplikacji (a także do aktualizacji po wydaniu nowszej wersji). W tym skrypcie utworzę skrót do pulpitu do aplikacji, którą przechowuję w katalogu Dokumenty użytkownika. Przechowuję również ikonę aplikacji w tym katalogu, który dołączam do skrótu aplikacji.

Jeśli nigdy nie stworzył skrót za pośrednictwem VBA/skrypt, będziesz zasadniczo zrobić coś takiego (napisany w języku VBScript):

Dim WinShell 
Dim ShtCut 

Set WinShell = CreateObject("WScript.Shell") 
Set ShtCut = WinShell.CreateShortcut(strDesktopPath & "\MyCoolApp.lnk") 

With ShtCut 
    .TargetPath = (See below) 
    .Arguments = (See below) 
    .IconLocation = ... 
    .Desciption = "This is the coolest app, yo!" 
    .WorkingDirectory = strAppPath 
    .WindowStyle = 1 
    .Save 
End With 

Teraz celem skrótu zaczęło się jako coś to:

"C:\Users\UserName\Public\Documents\MyCoolApp\MyCoolApp.accdb" 

Oczywiście użytkownicy mogą mieć inną strukturę przedsiębiorstwa na miejscu dokumenty ...

Co powyższego postu sugeruje odniesienie robi zamienia ten skrót na skrypt linii poleceń psuedo.

Aby to zrobić:

pierwsze, rzeczywisty cel będzie ścieżka do wersji użytkownika dostępu (Runtime lub pełne), takie jak:

"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" 

ważna! Będziesz musiał owijać ten cel podwójnymi cudzysłowami, tj.:

.TargetPath = Chr(34) & strAccessPath & Chr(34) 

Następny (i nie znajdziesz tego na powyższym stanowisku, musiałem zrozumieć to), trzeba ustawić argument do katalogu aplikacji, takich jak:

"C:\Users\UserName\Public\Documents\MyCoolApp\MyCoolApp.accdb" 

WAŻNE! Znowu będziesz musiał owinąć argumenty w cudzysłów, tj .:

.Arguments = Chr(34) & strAppPath & Chr(34) 

Równie ważne, mam nadzieję, że aplikacja jest cool.

Po skonfigurowaniu tego skrótu zasadniczo tworzysz go tak, aby aplikacja zawierała własną grupę roboczą na pasku zadań. Oznacza to, że jeśli Access jest ogólnie otwarty, Twoja aplikacja będzie miała własną grupę na pasku zadań. Ta grupa będzie mieć skojarzoną z nią fajną, niestandardową ikonę. I jako ogromny nieoczekiwany bonus, będziesz mógł przypiąć swój skrót do paska zadań poza Access. SWEEEEEET!

Powodzenia!