我有一个主窗体的访问应用程序。当您打开应用程序时,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工作,而不是其他微软软件,继续在我的搜索结果,所以我不会在这里命名它。
谢谢!