|
|
|
Supreme Being
      
участник
Last Login: 06.07.2008 10:37
Сообщ.: 236,
Visits: 1 734
|
|
| Добрый день. Задача - приостановить работу приложения, чтобы нужное окно успело прорисоваться. Нашел в MSDN метод потока Sleep. Кажется то, что нужно, только это метод Класса Thread, следственно вопрос - Как получить поток приложения? А если в приложении несколько потоков ( Используется Timer. ) ?. Спасибо. PS: VS 2005. FW 2.0.
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Thread.CurrentThread В случае нескольких потоков надо просто выполнять всю работу вне первого потока (который обрабатывает все события) и проблем с перерисовкой не будет.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 06.07.2008 10:37
Сообщ.: 236,
Visits: 1 734
|
|
| Спасибо, bazile. Это работает. Но как мне кажется, такой подход - приостановка процесса приложения не есть хорошо. Может быть посоветуете что-то другое? Поясню суть проблемы: Приложение мониторит систему на возникновение определенного события. ( Появляется сообщение об ошибке. ) В этот момент приложение породившее исключение может быть перекрыто другими окнами, поэтому нужно вытащить его на верхний Z уровень, сфоткать и отослать куда надо. :). Так вот, проблема в том, что ScreenShot выполняется сразу после функции SetForegroundWindow и нужное окно не всегда успевает прорисоваться и поэтому получается "каша". Есть мысль использовать метод WndProc класса NativeWindow для получения события OnPaint этого окна. ( Хэндлер окна имеется. ), чтобы дождаться окончания прорисовки и только после этого продолжить выполнение программы. Но с реализацией туговато. Как думаете, сработает ли такой подход? Имеет смысл тратить время на его реализацию? Или есть способ проще?
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Использовать паузу в этом случае не очень хорошая идея, согласен, но другого рабочего способа тоже предложить не могу.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541,
Visits: 16 997
|
|
| А как насчет Control.DrawToBitmap ? UPD. А, пардон, окно-то не managed может быть... Тогда, пожалуй, можно поставить хук на WH_SHELL и ловить HSHELL_WINDOWACTIVATED сразу после отлова ошибки.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 06.07.2008 10:37
Сообщ.: 236,
Visits: 1 734
|
|
Вы правы, уважаемый messir, окошко именно "неуправляемое", и проблема как раз в синхронизации процесса SetForegroundWindow и процесса приложения. Т.е. код примерно следующий:public void CaptureWindowToFile( string filename, ImageFormat format ){ IntPtr handler = User32.FindWindow( "AnyNameClass", "AnyNameWindow" ); User32.SetForegroundWindow ( handler );/* Следующая функция не "ждет" завершения выполнения предыдущей т.к. это - [DllImport( "USER32.DLL" )]public static extern bool SetForegroundWindow ( IntPtr hWnd );, объявленная в static классе User32 */ Image img = CaptureWindow( User32.GetDesktopWindow( ) );... }
Я где то читал, что с помощью NativeWindow можно "подменить" событие окна на свое, тем самым видимо можно синхронизировать выполнение этих процессов. Кто нибудь знает так ли это?
|
|
|
|
|
Supreme Being
      
участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541,
Visits: 16 997
|
|
slamer (24.11.2006) Я где то читал, что с помощью NativeWindow можно "подменить" событие окна на свое, тем самым видимо можно синхронизировать выполнение этих процессов. Кто нибудь знает так ли это?Так-то оно так, только что перехватывать? Можно WM_PAINT, в принципе, и давать команду на полную перерисовку...
|
|
|
|