2
我有一個使用WinForms的跨平臺.NET應用程序。如何在Linux上爲WinForms應用程序更改WM_CLASS?
爲了與Unity更好的兼容性我想設置一個WinForms窗口的WM_CLASS
屬性。這可能嗎?
我有一個使用WinForms的跨平臺.NET應用程序。如何在Linux上爲WinForms應用程序更改WM_CLASS?
爲了與Unity更好的兼容性我想設置一個WinForms窗口的WM_CLASS
屬性。這可能嗎?
似乎有全樣本項目在這裏bitbucket.org/hindlemail/settingwmclass:
示例項目展示瞭如何設置在Linux上運行的 單WinForm應用程序的WM_CLASS X11財產。這使單聲道winforms 應用程序與unity + gnome3窗口管理器表現更好。
// Managed struct of XSetClassHint classHint.
public struct XClassHint
{
public IntPtr res_name;
public IntPtr res_class;
}
[DllImport ("libX11", EntryPoint="XSetClassHint", CharSet=CharSet.Ansi)]
public extern static int XSetClassHint(IntPtr display, IntPtr window, IntPtr classHint);
public static void SetWmClass(string name, string @class, IntPtr handle)
{
var a = new NativeX11Methods.XClassHint {
res_name = Marshal.StringToCoTaskMemAnsi(name),
res_class = Marshal.StringToCoTaskMemAnsi(@class)
};
IntPtr classHints = Marshal.AllocCoTaskMem(Marshal.SizeOf(a));
Marshal.StructureToPtr(a, classHints, true);
NativeX11Methods.XSetClassHint(NativeReplacements.MonoGetDisplayHandle(), NativeReplacements.MonoGetX11Window(handle), classHints);
Marshal.FreeCoTaskMem(a.res_name);
Marshal.FreeCoTaskMem(a.res_class);
Marshal.FreeCoTaskMem(classHints);
}
哇哦,我沒有發現樣本項目,謝謝!不過,你只引用瞭解決方案的一小部分。示例項目中的NativeReplacements類負責處理如何獲取X11顯示和窗口引用的所有令人討厭的細節。 – bseibold 2012-07-13 14:24:48