WinForms: открыть окно сообщения из метода WndProc (класс Form) - PullRequest
1 голос
/ 14 апреля 2011

Я представлял, что WndProc вызывается в другом потоке, а не в основном потоке пользовательского интерфейса.

Я был прав, поэтому я подумал, что простого использования InvokeRequired и Invoke в форме было достаточно для отображения окна сообщений в потоке пользовательского интерфейса..

Я был не прав.И я не понимаю, почему.

Как обойти эту проблему? Я посмотрел в Google, но не нашел решения.

Я пытаюсь сделать этопросто вызывая пользовательское событие (ClipboardUpdate), когда буфер обмена изменяется

, окно сообщений было просто тестом, но не работало, в то время как просто изменяло что-то вроде строки (приватное поле формы), но это неХорошо, что это поведение, потому что это многопоточная операция небезопасным способом.

Обновление 1:

У меня нет кода здесь, потому что я его создал накомпьютер друга, однако я могу точно объяснить, что я написал, потому что это короткий.Я создал базовую winform с визуальной студией, без чего-либо.Я использовал функцию AddClipboardFormatListener (interop, но она довольно проста как функция, возвращает int и принимает IntPtr) (в ОС Windows 7), чтобы просто обнаружить сообщение WM_CLIPBOARDUPDATE внутри winproc (простой if, * if (e.Msg == ClipboardExtension).WM_CLIPBOARDUPDATE) DoClipboardUpdate (); *).

Теперь DoClipboardUpdate делает это:

if (InvokeRequired)
    Invoke(new VoidDelegate(OnClipboardUpdate));//Void delegate it's a delegate that doesn't take
    // Params and returns void
else
    OnClipboardUpdate();

Довольно просто, верно?OnClipboardUpdate просто делает это:

if (ClipboardUpdate != null) ClipboardUpdate(null,EventArgs.Empty);

ClipboardUpdate - это событие, объявленное следующим образом:

public event EventHandler<EventArgs> ClipboardUpdate;

В конце, единственный метод, подписанный на событие ClipboardUpdate, имеет это внутри:

MessageBox.Show("test");

Что происходит, когда я запускаю код?Событие запускается (я пытался с исключением, и оно работает), и окно сообщений не всплывает, однако я больше не могу взаимодействовать с моей формой, потому что она ведет себя так, как будто открылось всплывающее окно (это "нормальное" поведение, когдавы открываете всплывающее окно в другой ветке, поэтому я так и сказал).

Есть предложения, как это решить?

1 Ответ

1 голос
/ 22 июля 2011

Я не понимаю, почему это происходит, но я создал новый проект, и открытие окна сообщений из WndProc работает нормально, возможно, некоторые потоки повредили память основного потока, я не знаю этого, но, как другие заявили, wndproc является потоком пользовательского интерфейса идолжно работать

...