【问题标题】:No Balloon Tooltip Close Buttons in Windows Server 2008Windows Server 2008 中没有气球工具提示关闭按钮
【发布时间】:2012-12-29 21:52:11
【问题描述】:

我的程序在应用程序中使用气球通知气泡来引导用户,在 Windows XP 中,气球窗口的右上角有一个小“X”来在单击时关闭窗口,如果您单击其中的任何位置,窗口也会关闭即使您不点击“X”,它也一样。

但是,当程序在 Windows Server 2008 上运行时,气球会出现,但没有“X”按钮,并且当我单击它们时也不会关闭。

我无意中通过删除包含以下内容的 .MANIFEST 文件来复制 Windows XP 中的行为:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="2.0.0.0" processorArchitecture="x86" name="SofrwareName" type="win32" />
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="<Removed>" language="*" processorArchitecture="x86" />
        </dependentAssembly>
    </dependency>
</assembly>

当我删除此清单并在 Windows XP 中运行我的程序时,气球的行为就像在 Windows Server 2008 中一样。我假设这可能意味着与 Windows Server 2008 中的 Common Controls v6 存在某种不兼容。

有谁知道是什么原因导致气球在点击时没有关闭并且没有“X”关闭按钮?

更新:这是气球创建代码:

m_tool = new MessageTool(); //internal class MessageTool : NativeWindow {...}

CreateParams cp = new CreateParams();
cp.ClassName = TOOLTIPS_CLASS; //TOOLTIPS_CLASS = "tooltips_class32";
cp.Style =
    WS_POPUP |
    TTS_BALLOON |
    TTS_NOPREFIX |
    TTS_ALWAYSTIP |
    TTS_CLOSE;

m_ti = new TOOLINFO();
/*
[StructLayout(LayoutKind.Sequential)]
private struct TOOLINFO
{
    public int cbSize;
    public int uFlags;
    public IntPtr hwnd;
    public IntPtr uId;
    public RECT rect;
    public IntPtr hinst;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string lpszText;
    public uint lParam;
}
*/

m_ti.cbSize = Marshal.SizeOf(m_ti);

m_tool.CreateHandle(cp);

m_ti.uFlags = TTF_TRACK |
    TTF_CLOSEONMOUSECLICK |
    TTF_TRANSPARENT |
    TTF_SUBCLASS |
    TTF_PARSELINKS;

m_ti.uId = m_tool.Handle;
m_ti.lpszText = m_text;
m_ti.hwnd = m_parent.Handle;

WindowsAPI.GetClientRect(m_parent.Handle, ref m_ti.rect);
ClientToScreen(m_parent.Handle, ref m_ti.rect);

WindowsAPI.SetWindowPos(
    m_tool.Handle,
    HWND_TOP,
    0, 0, 0, 0,
    (int)SetWindowPosFlags.SWP_NOACTIVATE |
    (int)SetWindowPosFlags.SWP_NOMOVE |
    (int)SetWindowPosFlags.SWP_NOSIZE);

IntPtr ptrStruct = Marshal.AllocHGlobal(Marshal.SizeOf(m_ti));
Marshal.StructureToPtr(m_ti, ptrStruct, true);

WindowsAPI.SendMessage(
    m_tool.Handle, TTM_ADDTOOL, 0, ptrStruct);

m_ti = (TOOLINFO)Marshal.PtrToStructure(ptrStruct,
    typeof(TOOLINFO));

WindowsAPI.SendMessage(
    m_tool.Handle, TTM_SETMAXTIPWIDTH,
    0, new IntPtr(m_maxWidth));

WindowsAPI.SendMessage(
    m_tool.Handle, TTM_SETTITLE,
    (int)m_titleIcon, ptrTitle);

SetBalloonPosition(m_ti.rect);

Marshal.FreeHGlobal(ptrStruct);
Marshal.FreeHGlobal(ptrTitle);

和 Windows 构建信息:Windows Server Standard、SP2、32 位

【问题讨论】:

  • 更具体地了解确切的 Server 2008 版本和您使用的工具提示类型。还应包括一个显示工具提示如何显示的 sn-p。
  • @HansPassant 为您添加了 sn-p 和 Windows 版本信息。
  • @HansPassant 我主要在寻找与 Win2008 和 Common Controls v6 的已知兼容性问题,因此它不是“过于本地化”。这就是为什么我最初没有费心包含代码的原因。

标签: c# winforms .net-4.0 notifications common-controls


【解决方案1】:

这可能无济于事,我不想轻描淡写,但我遇到了一些问题,即应用程序由于文件/文件夹权限而无法访问 DLL,并且还看到文件在传输时被锁定的位置计算机之间(甚至是同一域内的计算机)。要取消阻止它,您必须通过 Windows 资源管理器进入文件的属性,在“高级”下并取消阻止该文件。

【讨论】:

  • 在这种情况下我们将讨论哪些 .dll 文件?
  • 抱歉,我认为气球通知气泡来自 Microsoft.Windows.Common-Controls 的控件;但是重新阅读并且您说除了x按钮之外的控件加载,所以它可能不是那样的。但是,可能无法访问该程序集引用的任何外部文件(例如,存储为单个 ico 文件甚至简单 gif 的图标文件集合),因为开发人员程序集在编译时假定它具有权限,因为有没有UAC的概念。假设它是您正在加载的控件,是否有任何 ChildControls 或您可以访问的成员...
  • ...查看 x 按钮是否正在尝试加载? x 正在加载但显示在气球后面也是可行和简单的,即 z-index 比气球低......对不起,我知道这不是具体的,但希望有所帮助。
  • 这不仅仅是 X 按钮不显示的问题。由于某种原因,我们在气球窗口内单击 ANYWHERE 关闭气球的行为也被破坏了。无论是在 Win 2008 中使用还是在 XP 中使用并删除清单文件时。
  • 查看来自 stackoverflow 的其他帖子:stackoverflow.com/questions/10330105/…
猜你喜欢
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多