Я представлял, что 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");
Что происходит, когда я запускаю код?Событие запускается (я пытался с исключением, и оно работает), и окно сообщений не всплывает, однако я больше не могу взаимодействовать с моей формой, потому что она ведет себя так, как будто открылось всплывающее окно (это "нормальное" поведение, когдавы открываете всплывающее окно в другой ветке, поэтому я так и сказал).
Есть предложения, как это решить?