这我知道,不过我封送后调用GetClassInfo,永远返回0,也就是调用失败,不知为何?
主要代码如下:
[DllImport("user32",CharSet = CharSet.Unicode,EntryPoint = "GetClassInfoW")]
public static extern int GetClassInfo (
IntPtr hInstance,
[MarshalAs(UnmanagedType.LPWStr)]
string lpClassName,
ref WNDCLASS lpWndClass);
public delegate uint MWAPROC (IntPtr hwnd, uint message, uint wParam, int lParam);
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
public struct WNDCLASS
{
[MarshalAs(UnmanagedType.U4)]
public uint style;
public MWAPROC lpfnWndProc;
public int cbClsExtra;
public int cbWndExtra;
public IntPtr hInstance;
public IntPtr hIcon;
public IntPtr hCursor;
public IntPtr hbrBackground;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 128)]
public string lpszMenuName;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 128)]
public string lpszClassName;
}
主要代码如下:
[DllImport("user32",CharSet = CharSet.Unicode,EntryPoint = "GetClassInfoW")]
public static extern int GetClassInfo (
IntPtr hInstance,
[MarshalAs(UnmanagedType.LPWStr)]
string lpClassName,
ref WNDCLASS lpWndClass);
public delegate uint MWAPROC (IntPtr hwnd, uint message, uint wParam, int lParam);
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
public struct WNDCLASS
{
[MarshalAs(UnmanagedType.U4)]
public uint style;
public MWAPROC lpfnWndProc;
public int cbClsExtra;
public int cbWndExtra;
public IntPtr hInstance;
public IntPtr hIcon;
public IntPtr hCursor;
public IntPtr hbrBackground;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 128)]
public string lpszMenuName;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 128)]
public string lpszClassName;
}
public string lpszMenuName;
[MarshalAs(UnmanagedType.LPWStr)]
public string lpszClassName;
WNDCLASS wndClass = new WNDCLASS();
int n = GetClassInfo(this.Handle,this.Name,ref wndClass);
if (n != 0) MessageBox.Show(wndClass.style.ToString());
else MessageBox.Show("Error!");
this为该窗体(Form)的一个实例,不知为何?
是你传递的两个参数:
hInstance:应该是当前运行的进程的hInstance,不是窗口句柄。
lpszClassName: 应该是当前窗口的窗口类型名称,不是穿口标题或者Name属性。[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
private extern static IntPtr GetModuleHandle(string lpModuleName);[DllImport("user32.dll", CharSet=CharSet.Auto)]
private extern static int GetClassName(IntPtr hwnd, StringBuilder buffer, int cnt);[DllImport("user32",CharSet = CharSet.Unicode,EntryPoint = "GetClassInfoW")]
public extern static int GetClassInfo (
IntPtr hInstance,
[MarshalAs(UnmanagedType.LPWStr)]
string lpClassName,
out WNDCLASS lpWndClass);
...
StringBuilder sb = new StringBuilder(128);
GetClassName(this.Handle, sb, 128);IntPtr hInstance = GetModuleHandle(null);WNDCLASS wndinfo;
int ret = GetClassInfo(hInstance, sb.ToString(), out wndinfo);
if (ret != 0)
{
//got the class info
}