2014-10-27 46 views
6

我有一個主窗體的訪問應用程序。當您打開應用程序時,AutoExec宏通過Windows API apiShowWindow隱藏應用程序。然後,AutoExec打開設置爲Popup的主窗體。這一切都很漂亮。我的數據庫內容被隱藏起來,表單打開並且漂浮。訪問應用程序,帶窗體的隱藏應用程序窗口任務欄圖標

但是,當訪問數據庫被隱藏時,會丟失任務欄圖標。我在Options \ Current Database \ Application Icon設置中設置了一個自定義圖標。如果我不隱藏數據庫,該圖標在任務欄中顯示得很好。

我發現了一個API解決方法,只在窗體的任務欄中顯示一個圖標。它有點像這樣:

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 

這種方法確實有效;我在任務欄中獲得專用於該表單的圖標。但是,任務欄中的圖標是標準的Access圖標。

爲了應對這個問題,我添加使用SendMessageA另一個API調用:

公開聲明函數SendMessage32庫 「USER32」 別名_ 「SendMessageA」(BYVAL的hWnd長,BYVAL WMSG長, _ BYVAL的wParam 長,BYVAL lParam的長),只要

這樣執行的:

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 

請記住,我已經嘗試了以上四行'SendMessages'的AppTasklist Sub內部和外部,頂部和底部的各種命令,無濟於事。

它似乎在應用程序級別上工作,但它似乎從未在表單級別工作。

對於那些熟悉這種特殊困境的人,讓我列出一些我嘗試過的VBA之外的其他選項。

1.)Taskbar \ Properties \ Taskbar按鈕。我已將此菜單選項更改爲「無法合併」和「合併時任務欄已滿」。所以,基本上,這是行得通的。我現在得到我的圖標只是文件夾和小標籤。但(!),只有當用戶在他們的最後檢查這些設置時纔有效。根據我的經驗,幾乎沒有人使用除「總是組合,隱藏標籤」之外的任何選項。

2.)更改註冊表設置。您可以更改以下注冊表項以更改應用程序使用的默認圖標:「HKEY_CLASSES_ROOT \ Access.Application.14 \ DefaultIcon(默認)」。但是,大多數用戶(包括我自己)都無法訪問註冊表的HKEY_CLASSES_ROOT部分。此外,我將不得不編寫一些代碼來找到正確的密鑰,然後對其進行更改(我可以這樣做),但是,目前還不清楚這種更改是否會立即生效 - 更不用說我必須在退出時更改它應用。 3.)右鍵單擊固定的應用程序,然後右鍵單擊菜單中的應用程序會在「快捷方式」選項卡中爲您提供一個名爲「更改圖標...」的按鈕的屬性菜單。但是,對於像Access這樣的程序,這個按鈕是灰色的。

我正在使用Windows 7和Access 2010。

是否可以將上述場景中的任務欄圖標強制爲標準訪問圖標以外的其他內容?

我覺得以太有一點我缺少的東西,或者一個可以使用的API函數,或者一個更好的SendMessage常量,或者說,也許它只是無法完成。

任何幫助將不勝感激。

此外,作爲免責聲明(我猜):顯然上面的代碼是從這個論壇和其他人的帖子中提取的。大部分是從我得到它沒有歸屬。我做了一些微小的推文,使其在Access工作,而不是其他微軟軟件,繼續在我的搜索結果,所以我不會在這裏命名它。

謝謝!

回答

2

好的。所以我要回答我自己的問題。顯然,我真正需要的是從行動中突破,並輸出我的問題。在我發佈這個問題後不久,我又回到了馬上,並嘗試了更多的搜索條件。我最終偶然發現了一個看起來並不富有成效的文章,因爲我不清楚海報和我自己是否正在處理相同的情況。

,我發現我的答案在這裏:

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

首先,應用程序必須通過快捷方式打開。幸運的是,我從開始就一直使用桌面快捷方式。

當我開始構建應用程序時,從一開始我就知道我將使用VBScript來執行應用程序的安裝(以及在更新版本發佈時進行更新)。在該腳本中,我爲應用程序創建了一個桌面快捷方式,該快捷方式存儲在用戶的Documents目錄中。我還將應用程序圖標存儲在附加到應用程序快捷方式的那個目錄中。

如果你從來沒有創建通過VBA /腳本的快捷方式,你基本上是做這樣的事情(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 

,該快捷方式的目標開始了是類似這樣的:

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

顯然,您的用戶可能有不同的企業結構的文件位置...

什麼上述基準柱建議做將該快捷方式轉換爲僞命令行腳本。

要做到這一點:

首先,你的實際目標是要像這樣的路徑對用戶的版本的Access(運行或全部),:

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

重要!您必須將此目標用雙引號括起來,即:

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

下一頁(你會不會在上面後發現這一點,我必須弄清楚),你需要的參數設置爲應用程序的目錄,像這樣的:

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

重要!再次,你必須用雙引號括住參數,例如:

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

同樣重要的是,我希望你的應用很酷。

一旦你建立了這個快捷方式,基本上你就可以做到這一點,所以你的應用程序將在任務欄上擁有自己的工作組。也就是說,如果Access一般是打開的,你的應用程序將在任務欄上有它自己的組。這個組會有你的酷,自定義圖標與之相關聯。作爲一個巨大的意外獎勵,您可以將您的快捷方式固定到Access以外的任務欄。 SWEEEEEET!

祝你好運!