2014-10-27 40 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!

祝你好运!