2014-10-27 8 views
6

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!

Antwort

2

Okay. Also werde ich meine eigene Frage beantworten. Anscheinend war alles, was ich wirklich brauchte, eine Pause von der Aktion und um mein Problem zu beschreiben. Kurze Zeit nachdem ich die Frage gestellt hatte, stieg ich wieder auf das Pferd und probierte weitere Suchbegriffe aus. Ich bin schließlich auf eine Stelle gestoßen, die zu Beginn nicht wirklich fruchtbar schien, weil mir nicht klar war, ob das Plakat und ich mit dem gleichen Szenario zu tun hatten.

fand ich meine Antwort hier:

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

First off, Ihre Anwendung über eine Verknüpfung öffnen müssen. Zum Glück habe ich von Anfang an eine Desktop-Verknüpfung verwendet.

Als ich anfing, die Anwendung zu erstellen, wusste ich von Anfang an, dass ich ein VBScript verwenden würde, um die Installation der Anwendung durchzuführen (und auch zu aktualisieren, wenn eine neuere Version veröffentlicht wird). In diesem Skript erstelle ich eine Desktop-Verknüpfung zu der Anwendung, die ich im Verzeichnis Dokumente des Benutzers speichern. Ich speichere auch das Anwendungssymbol in dem Verzeichnis, das ich der Anwendungsverknüpfung anhefte.

Wenn Sie noch nie eine Verknüpfung über vba/script erstellt, werden Sie im Wesentlichen so etwas wie diese (geschrieben in 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 

Nun begann das Ziel der Verknüpfung etwas, aus wie dies:

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

Offensichtlich Benutzer kann eine andere Unternehmensstruktur für die Dokumente Lage ...

Was die oben Bezug Post schlägt tun wandelt diese Verknüpfung in ein psuedo-Befehlszeilenskript um.

dies zu tun:

Zuerst Ihr eigentliches Ziel der Pfad des Benutzers Version des Zugriffs (Runtime oder voll) sein wird, wie solche:

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

WICHTIG! Sie müssen dieses Ziel in doppelte Anführungszeichen setzen, d. H.:

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

Next (und Sie werden diese nicht in der oben genannten Post finde ich es, um herauszufinden, hatte), müssen Sie das Argument in das Verzeichnis der Anwendung, wie so einzustellen:

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

WICHTIG! Auch hier finden Sie die Argumente in Anführungszeichen wickeln müssen, d.h .:

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

auch wichtig, ich hoffe, dass Ihre App cool.

Sobald Sie diese Verknüpfung eingerichtet haben, machen Sie es im Wesentlichen so, dass Ihre Anwendung eine eigene Arbeitsgruppe in der Taskleiste hat. Das heißt, wenn Access allgemein geöffnet ist, hat Ihre Anwendung eine eigene Gruppe in der Taskleiste. Diese Gruppe wird mit Ihrem coolen, benutzerdefinierten Symbol verknüpft sein. Und als großer unerwarteter Bonus können Sie Ihre Verknüpfung außerhalb von Access an die Taskleiste anheften. SWEEEEEET!

Viel Glück!

Verwandte Themen