Доброго дня.
Заметил в C# такую особенность:
При попытке получить информацию по любому стандартному классу Windows (EDIT, BUTTON, COMBOBOX и др.) с помощью API функции GetClassInfoExA, получаю разные адреса оконной процедуры класса.
Пример:
Класс NativeMethods:
public partial class NativeMethods
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct TWndRecordEx
{
uint cbSize;
uint style;
public IntPtr lpfnWndProc;
public int cbClsExtra;
public int cbWndExtra;
public uint hInstance;
public uint HICON;
public uint hCursor;
public uint hbrBackground;
[MarshalAs(UnmanagedType.LPStr)]
public string lpszMenuName;
[MarshalAs(UnmanagedType.LPStr)]
public string lpszClassName;
public uint hIconSm;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false), DebuggerStepThrough]
public static extern bool GetClassInfoExA(uint hInstance, [MarshalAs(UnmanagedType.LPStr)]string lpClassName, out TWndRecordEx lpWndClass);
public static void WriteClassInfo()
{
TWndRecordEx wndRecEx = new TWndRecordEx();
if (GetClassInfoExA(0, "EDIT", out wndRecEx))
{
Debug.WriteLine(String.Format("GetClassInfoExA: Result=True; lpfnWndProc={0}; hInstance={1}", Convert.ToString(wndRecEx.lpfnWndProc.ToInt32(), 16), Convert.ToString(wndRecEx.hInstance, 16)));
}
else
{
Debug.WriteLine("GetClassInfoExA: Result=False");
}
}
}
Класс основной C# программы:
static class Program
{
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
NativeMethods.WriteClassInfo(); // точка 1
TextBox tb = new TextBox();
Button b = new Button();
b.Click += new EventHandler(b_Click);
Form btn = new Form();
//btn.Controls.Add(tb);
btn.Controls.Add(b);
btn.CreateControl();
btn.Shown += new EventHandler(btn_Shown);
btn.Show();
NativeMethods.WriteClassInfo(); // точка 2
//Application.Run(new Form1());
Application.Run(btn);
NativeMethods.WriteClassInfo(); // точка 3
}
static void b_Click(object sender, EventArgs e)
{
((sender as Button).Parent as Form).Hide();
NativeMethods.WriteClassInfo(); // точка 5
((sender as Button).Parent as Form).Show();
NativeMethods.WriteClassInfo(); // точка 6
}
static void btn_Shown(object sender, EventArgs e)
{
NativeMethods.WriteClassInfo(); // точка 4
}
}
Так вот в точке 1,2 и 3 адрес оконной процедуры стандартного класса Windows один, а в точке 4,5 и 6 совершенно другой адрес оконной функции возвращается.
Т.е. пока форма не отображается адрес один, как только форма отобразилась, адрес другой, при этом когда форма закрывается, адрес восстанавливается на первоначальный (точка 3).
При этом в Delphi например такой особенности нет, что создана форма, что нет, никак не влияет на стандартные оконные классы Windows.
В чем может быть такая особенность/проблема ? можно ли как-то указать в C# чтобы адреса возвращались постоянно одинаковые ?