Кнопки закрытия всплывающей подсказки в Windows Server 2008 отсутствуют
Моя программа использует всплывающие подсказки в приложении, чтобы направлять пользователя, в 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. Я предполагаю, что это может означать некоторую несовместимость с Common Controls v6 в Windows Server 2008.
Кто-нибудь знает, что может быть причиной того, что воздушные шары не закрываются при нажатии и не имеют кнопок закрытия "Х"?
ОБНОВЛЕНИЕ: Вот код создания шара:
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-разрядный
1 ответ
Это может не помочь, и мне неприятно тривиализировать его, но у меня были проблемы, когда приложение не имело доступа к библиотекам DLL из-за прав доступа к файлу / папке, а также видело, где файл блокируется при передаче его между компьютерами (даже компьютеры в одном домене). Чтобы разблокировать его, вы должны зайти в свойства файла через проводник Windows, в разделе "Дополнительно" и разблокировать файл.