<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>WPF</title><link>http://www.pixvillage.com/blogs/devblog/category/32.aspx</link><description>Windows Presentation Foundations related posts</description><managingEditor>Buz &amp; Skup</managingEditor><dc:language>en-US</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Buz &amp; Skup</dc:creator><title>Disable Screen Saver while running your WPF Application</title><link>http://www.pixvillage.com/blogs/devblog/archive/2007/02/27/6493.aspx</link><pubDate>Tue, 27 Feb 2007 23:46:00 GMT</pubDate><guid>http://www.pixvillage.com/blogs/devblog/archive/2007/02/27/6493.aspx</guid><wfw:comment>http://www.pixvillage.com/blogs/devblog/comments/6493.aspx</wfw:comment><comments>http://www.pixvillage.com/blogs/devblog/archive/2007/02/27/6493.aspx#Feedback</comments><slash:comments>63</slash:comments><wfw:commentRss>http://www.pixvillage.com/blogs/devblog/comments/commentRss/6493.aspx</wfw:commentRss><trackback:ping>http://www.pixvillage.com/blogs/devblog/services/trackbacks/6493.aspx</trackback:ping><description>&lt;P&gt;I'm working on a WFP Media player application, and the first time I used it to watch a video, I just discovered I had forgotten something critical when the screen went black and a 3D stylish 'Woosh' apperead : that f***ing screen saver ! &lt;/P&gt;
&lt;P&gt;But how to disable it ?!&lt;BR&gt;First I searched the Internet and found something to disable it in the registry. But I don't like this, you need rights to write the registry, and how can you turn the screen saver back if your application quit unexpectedly (Ok you'll say it won't, it's well written, but I can kill it with the task manager :-S ). No way. &lt;/P&gt;
&lt;P&gt;Then I found something about the &lt;CODE&gt;WM_SYSCOMMAND message&lt;/CODE&gt;. The window receives this message with a value of &lt;CODE&gt;SC_SCREENSAVE&lt;/CODE&gt; when the screen saver should appear and you can prevent it to run by handling the message without doing anything. You can also get the &lt;CODE&gt;SC_MONITORPOWER&lt;/CODE&gt; value when the monitor enters a low consumption state. &lt;/P&gt;
&lt;P&gt;I like it ! But the point is how to handle this Win32 message in WPF, the no-windows-message world ? &lt;/P&gt;
&lt;P&gt;Actually, the main WPF Window is hosted in a Win32 window, represented by a &lt;CODE&gt;HwndSource&lt;/CODE&gt; object. You can get this object using the &lt;CODE&gt;PresentationSource.FromVisual&lt;/CODE&gt; method. The &lt;CODE&gt;HwndSource&lt;/CODE&gt; the provides a &lt;CODE&gt;AddHook&lt;/CODE&gt; method that takes a &lt;CODE&gt;Hook&lt;/CODE&gt; delegate that you can use to handle the message. It's a bit too easy. &lt;/P&gt;
&lt;P&gt;There is just one last thing. Calling &lt;CODE&gt;PresentationSource.FromVisual&lt;/CODE&gt; from the &lt;CODE&gt;Window&lt;/CODE&gt; constructor will return null since the window initialization is not terminated and it's not already hosted by the Win32 host. Just call it from the &lt;CODE&gt;SourceInitialized&lt;/CODE&gt; event. &lt;/P&gt;
&lt;P&gt;A minimal sample to summary all we said :&lt;/P&gt;

&lt;div class="code" style="font-family: Courier New; font-size: 10pt; color: black; background: white; border: solid 1p #e0e0e0;"&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;partial&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MainWindow&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Window&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; WM_SYSCOMMAND = 0x112;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; SC_SCREENSAVE = 0xF140;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; SC_MONITORPOWER = 0xF170;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; MainWindow()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SourceInitialized += &lt;span style="color: blue;"&gt;delegate&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;HwndSource&lt;/span&gt; source = (&lt;span style="color: #2b91af;"&gt;HwndSource&lt;/span&gt;)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;PresentationSource&lt;/span&gt;.FromVisual(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; source.AddHook(Hook);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt; Hook(&lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt; hwnd,&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; msg, &lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt; wParam, &lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt; lParam,&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;ref&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; handled)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (msg == WM_SYSCOMMAND &amp;amp;&amp;amp;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ((((&lt;span style="color: blue;"&gt;long&lt;/span&gt;)wParam &amp;amp; 0xFFF0) == SC_SCREENSAVE) ||&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ((&lt;span style="color: blue;"&gt;long&lt;/span&gt;)wParam &amp;amp; 0xFFF0) == SC_MONITORPOWER))&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; handled = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IntPtr&lt;/span&gt;.Zero;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;/div&gt;
&lt;P&gt;Just notice the &lt;CODE&gt;0xFFF0&lt;/CODE&gt; mask, it's because the system can use the 4 low order bits of the wParam value as stated in the MSDN library article about &lt;CODE&gt;WM_SYSCOMMAND&lt;/CODE&gt;. &lt;/P&gt;
&lt;P&gt;Now I can watch videos without mooving the mouse every 10 minutes ! I hope it can make your apps better to ! &lt;/P&gt;&lt;img src ="http://www.pixvillage.com/blogs/devblog/aggbug/6493.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>
