﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Программирование / .NET / C#  / Пауза в приложении. / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Sat, 22 Nov 2008 08:01:17 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Пауза в приложении.</title><link>http://www.relib.com/forums/Topic907505-26-1.aspx</link><description>[quote][b]slamer (24.11.2006)[/b][hr]Я где то читал, что с помощью NativeWindow можно "подменить" событие окна на свое, тем самым видимо можно синхронизировать выполнение этих процессов. Кто нибудь знает так ли это?[/quote]&lt;/P&gt;&lt;P&gt;Так-то оно так, только что перехватывать? Можно WM_PAINT, в принципе, и давать команду на полную перерисовку...</description><pubDate>Sat, 25 Nov 2006 00:18:11 GMT</pubDate><dc:creator>Messir</dc:creator></item><item><title>RE: Пауза в приложении.</title><link>http://www.relib.com/forums/Topic907505-26-1.aspx</link><description>Вы правы, уважаемый messir, окошко именно "неуправляемое", и проблема как раз в синхронизации процесса SetForegroundWindow и процесса приложения. Т.е. код примерно следующий:&lt;P&gt;[code]&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;public&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; CaptureWindowToFile( &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; filename, &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;ImageFormat&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; format )&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;IntPtr&lt;/FONT&gt;&lt;FONT size=2&gt; handler = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;User32&lt;/FONT&gt;&lt;FONT size=2&gt;.FindWindow( &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"AnyNameClass"&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"AnyNameWindow"&lt;/FONT&gt;&lt;FONT size=2&gt; ); &lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;User32&lt;/FONT&gt;&lt;FONT size=2&gt;.SetForegroundWindow ( handler );&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;/* Следующая функция не "ждет" завершения выполнения предыдущей т.к.&lt;/P&gt;&lt;P&gt; это - &lt;FONT size=2&gt;[&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;DllImport&lt;/FONT&gt;&lt;FONT size=2&gt;( &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"USER32.DLL"&lt;/FONT&gt;&lt;FONT size=2&gt; )]&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;extern&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;bool&lt;/FONT&gt;&lt;FONT size=2&gt; SetForegroundWindow&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;( &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;IntPtr&lt;/FONT&gt;&lt;FONT size=2&gt; hWnd );, объявленная в static классе &lt;FONT color=#008080&gt;User32 */&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;&lt;FONT color=#008080 size=2&gt;&lt;P&gt;Image&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; img = CaptureWindow( &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;User32&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;.GetDesktopWindow( ) );&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#000000&gt;...&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;[/code]&lt;/P&gt;&lt;P&gt;Я где то читал, что с помощью NativeWindow можно "подменить" событие окна на свое, тем самым видимо можно синхронизировать выполнение этих процессов. Кто нибудь знает так ли это?</description><pubDate>Fri, 24 Nov 2006 17:21:13 GMT</pubDate><dc:creator>slamer</dc:creator></item><item><title>RE: Пауза в приложении.</title><link>http://www.relib.com/forums/Topic907505-26-1.aspx</link><description>А как насчет Control.DrawToBitmap ?&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;UPD.&lt;/STRONG&gt; А, пардон, окно-то не managed может быть... Тогда, пожалуй, можно поставить хук на WH_SHELL и ловить HSHELL_WINDOWACTIVATED сразу после отлова ошибки.</description><pubDate>Tue, 21 Nov 2006 00:05:43 GMT</pubDate><dc:creator>Messir</dc:creator></item><item><title>RE: Пауза в приложении.</title><link>http://www.relib.com/forums/Topic907505-26-1.aspx</link><description>Использовать паузу в этом случае не очень хорошая идея, согласен, но другого рабочего способа тоже предложить не могу.</description><pubDate>Wed, 15 Nov 2006 16:59:53 GMT</pubDate><dc:creator>bazile</dc:creator></item><item><title>RE: Пауза в приложении.</title><link>http://www.relib.com/forums/Topic907505-26-1.aspx</link><description>Спасибо, bazile. &lt;/P&gt;&lt;P&gt;Это работает. Но как мне кажется, такой подход - приостановка процесса приложения не есть хорошо. Может быть посоветуете что-то другое? Поясню суть проблемы:&lt;/P&gt;&lt;P&gt;Приложение мониторит систему на возникновение определенного события. ( Появляется сообщение об ошибке. ) В этот момент приложение породившее исключение может быть перекрыто другими окнами, поэтому нужно вытащить его на верхний Z уровень, сфоткать и отослать куда надо. :). Так вот, проблема в том, что ScreenShot выполняется сразу после функции SetForegroundWindow и нужное окно не всегда успевает прорисоваться и поэтому получается "каша". &lt;/P&gt;&lt;P&gt;Есть мысль использовать метод WndProc класса NativeWindow для получения события OnPaint этого окна. ( Хэндлер окна имеется. ), чтобы дождаться окончания прорисовки и только после этого продолжить выполнение программы. Но с реализацией туговато.&lt;/P&gt;&lt;P&gt;Как думаете, сработает ли такой подход? Имеет смысл тратить время на его реализацию? Или есть способ проще?</description><pubDate>Wed, 15 Nov 2006 15:13:35 GMT</pubDate><dc:creator>slamer</dc:creator></item><item><title>RE: Пауза в приложении.</title><link>http://www.relib.com/forums/Topic907505-26-1.aspx</link><description>Thread.CurrentThread&lt;/P&gt;&lt;P&gt;В случае нескольких потоков надо просто выполнять всю работу вне первого потока (который обрабатывает все события) и проблем с перерисовкой не будет.</description><pubDate>Wed, 15 Nov 2006 13:08:39 GMT</pubDate><dc:creator>bazile</dc:creator></item><item><title>Пауза в приложении.</title><link>http://www.relib.com/forums/Topic907505-26-1.aspx</link><description>Добрый день.&lt;/P&gt;&lt;P&gt;Задача - приостановить работу приложения, чтобы нужное окно успело прорисоваться. Нашел в MSDN метод потока Sleep. Кажется то, что нужно, только это метод Класса Thread, следственно вопрос - Как получить поток приложения? А если в приложении несколько потоков ( Используется Timer. ) ?.&lt;/P&gt;&lt;P&gt;Спасибо.&lt;/P&gt;&lt;P&gt;PS: VS 2005. FW 2.0.</description><pubDate>Wed, 15 Nov 2006 12:12:24 GMT</pubDate><dc:creator>slamer</dc:creator></item></channel></rss>