No Balloon Tooltip Close Buttons in Windows Server 2008

565 Views Asked by At

My program uses balloon notification bubbles within the app to guide the user, in Windows XP the balloon windows have little 'X's in the top right corner to close the window when clicked, and also the window closes if you click anywhere inside of it even if you don't click the 'X'.

However when the program is running on Windows Server 2008 the balloons appear but have no 'X' buttons and do not close when I click on them either.

By accident I managed to replicate the behavior in Windows XP by deleting a .MANIFEST file that contains this:

<?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>

When I delete this manifest and run my program in Windows XP the balloon acts just like it does in Windows Server 2008. I'm assuming that this might mean some sort of incompatibility with Common Controls v6 in Windows Server 2008.

Does anyone know what might be causing the balloons not to close on click and to have no 'X' close buttons?

UPDATE: Here is the balloon creation code:

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);

And Windows build info: Windows Server Standard, SP2, 32-bit

1

There are 1 best solutions below

7
On

This may not help, and I hate to trivialize it, but I've had issues wherein the application did not have access to the DLLs due to file/folder permissions, and have also seen where a file becomes locked when transferring it between computers (even computers within the same domain). To unblock it, you have to go into the properties of the file via Windows Explorer, under Advanced and unblock the file.