"Ошибка создания дескриптора окна" после определения переопределенного метода WndProc

Я создал простой проект WinForms, ничего не делал, просто добавил этот код в Form1.cs:

    protected override void WndProc(ref Message m)
    {
    }

И это все. Компилируется, но выдает исключение "Ошибка создания дескриптора окна". Как на экране:

http://oi62.tinypic.com/ivgww5.jpg

Другое дело, что у меня есть проект, созданный пару дней назад и использующий WndProc без каких-либо исключений. Кто-нибудь может объяснить мне, в чем может быть проблема здесь?

Спасибо за помощь,

Кстати. Трассировки стека:

   at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
   at System.Windows.Forms.Control.CreateHandle()
   at System.Windows.Forms.Form.CreateHandle()
   at System.Windows.Forms.Control.get_Handle()
   at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
   at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
   at System.Windows.Forms.Control.set_Visible(Boolean value)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at WindowsFormsApplication1.Program.Main() in C:\Users\Johny\Documents\Visual Studio 2010\Projects\Temp\WindowsFormsApplication1\WindowsFormsApplication1\Program.cs:line 18
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

1 ответ

Решение

Вы переопределяете метод WndProc и не обрабатываете все возможные сообщения WM_*, поэтому не обрабатываете их должным образом.

Чтобы решить эту проблему, вы должны передать сообщение base.WndProc(..)

protected override void WndProc(ref Message m)
{
   base.WndProc(ref m);
}

Переопределение WndProc полезно, когда вы хотите что-то сделать с некоторым входящим сообщением WM_*, однако обеспечить полную реализацию WndProc по-своему сложно, самый простой способ - переслать сообщения, которые вас не интересуют, в базовый класс.

Другие вопросы по тегам