Windows Server 2008中没有气球工具提示关闭按钮

本文关键字:气球 工具提示 关闭按钮 Server 2008 Windows | 更新日期: 2023-09-27 17:53:15

我的程序在应用程序中使用气球通知气泡来引导用户,在Windows XP中,气球窗口的右上角有一个小"X",当点击时关闭窗口,如果你点击它里面的任何地方,即使你没有点击"X",窗口也会关闭。

然而,当程序在Windows Server 2008上运行时,气球出现,但没有'X'按钮,当我点击它们时也不关闭。

我无意中成功地在Windows XP中复制了这个行为,我删除了一个包含以下内容的.MANIFEST文件:

<?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中的通用控件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位

Windows Server 2008中没有气球工具提示关闭按钮

这可能没有帮助,我讨厌把它简化,但我遇到了一些问题,其中应用程序由于文件/文件夹权限而无法访问dll,并且还看到了文件在计算机之间传输时被锁定的地方(甚至是同一域内的计算机)。要取消阻塞,你必须通过Windows资源管理器进入文件属性,在高级选项下取消阻塞文件