Что эквивалентно PostMessage для себя, для Windows Forms? - PullRequest
3 голосов
/ 30 января 2009

Я пишу пользовательский элемент управления, полученный из System.Windows.Forms.Control.

Элемент управления использует событие Control.KeyDown для отслеживания нажатий клавиш: я должен обрабатывать некоторые нажатия клавиш (например, <Ctrl>-K) как горячие клавиши, что заставляет меня запускать диалоговое окно.

Если я запускаю диалоговое окно из моего onKeyDown обработчика событий, диалоговое окно отображается до того, как я установлю KeyEventArgs.SuppressKeyPress на true и вернусь (и поэтому я не могу подавить нажатие клавиши K). Вместо этого я хотел бы вернуться из обработчика событий onKeyDown и впоследствии запустить диалоговое окно. Для этого после того, как я вернусь из обработчика события onKeyDown, мне нужно каким-то образом снова вызвать его, с каким-то событием 'launch the dialog'.

На Win32 я мог бы сгенерировать это событие с помощью API PostMessage, чтобы отправить себе зарегистрированное оконное сообщение: я получал бы это сообщение сразу после любого предыдущего сообщения в своей очереди сообщений и использовал его в качестве сигнала для запустить мой диалог Однако здесь я не могу использовать функцию PostMessage (ни метод WndProc), потому что я хочу использовать строго управляемые API (без необходимости SecurityPermissionFlag::UnmanagedCode).

Так что было бы управляемым эквивалентом для потока (моего потока пользовательского интерфейса) для планирования асинхронного обратного вызова: возможно, таймер какого-то рода? Что-то вроде себя - Invoke?

Ответы [ 2 ]

3 голосов
/ 30 января 2009

Моей первой мыслью было «установить свойство SurpressKeyPress перед открытием диалога», но на самом деле это не отвечает на ваш вопрос. Если вам действительно нужно вернуться из обработчика событий перед открытием диалога, взгляните на метод BeginInvoke.

Вы могли бы сделать что-то вроде этого:

...
this.BeginInvoke(new InvokeDelegate(showDlg));
KeyEventArgs.SuppressKeyPress = true;
...


public void showDlg()
{
   // create and show dialog here
}
0 голосов
/ 30 января 2009

Вы можете запустить диалоговое окно из метода, определенного в вашей форме, и запустить метод из нового потока (включая System.Threading в ваших операторах using). Код в вашем событии нажатия кнопки будет выглядеть примерно так:

Thread thread = new Thread(new ThreadStart(LaunchDialog));
thread.Start();

где LaunchDialog - метод, запускающий новое диалоговое окно.

...