这我知道,不过我封送后调用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;
}

解决方案 »

  1.   

    [MarshalAs(UnmanagedType.LPWStr)]
    public string lpszMenuName;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string lpszClassName;
      

  2.   

    还是不对,GetClassInfo总是返回0
    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)的一个实例,不知为何?
      

  3.   

    照我前面一个贴子改过之后的API调用没有问题了。
    是你传递的两个参数:
    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
    }
      

  4.   

    可以了,谢谢qqchen79(知秋一叶 [MS MVP]) !