<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=154886&amp;view=findpost&amp;p=1268795</guid>
        <pubDate>Mon, 18 Sep 2006 11:33:10 +0000</pubDate>
        <title>О десктопах и семафорах</title>
        <link>https://forum.sources.ru/index.php?showtopic=154886&amp;view=findpost&amp;p=1268795</link>
        <description><![CDATA[ANDLL: Данный пример показывает, как работать с десктопами и семафорами.<br>
<br>
<strong class='tag-b'>Что будем делать?</strong><br>
Мы напишем программульку, которая будет создавать отдельный &quot;рабочий стол&quot; в системе, и переключать пользователя в него. В этом рабочем столе мы будем запускать эмулятор VMWare(в примере он заменем блокнотом, т.к. VMWare есть не у всех). Эмулятор будет выполняться совершенно обослебоно от всего, в новом рабочем столе нельзя вызвать деспетчер задач(т.е. вызвать можно, а вот увидеть - нет). Кроме того, единственное рабочее служебное сочетание клавиш - Win+L.  С помощью него можно сделать logout(и то не так то просто...), однако разблокировать windows все равно нельзя...<br>
После того как VMWare(или блокнот, или любая другая прога) закроется, появится окошко, с предложением ввести пароль. Замечу, что окошко можно закрыть, нажав на крестик, однако это будет весма не благоразумно, т.к. программа &quot;разблокировки&quot; то завершиться, а вот обратного переключения не произойдет, и пред вами предстанет голый десктоп :) Для разблокировки надо ввести пароль, <em class='tag-i'>AAA</em>.Только после этого произойдет &quot;взаправдашняя&quot; разблокировка.<br>
<br>
<strong class='tag-b'>Как?</strong><br>
Очень просто :) Для начала рекомендую таки почитать разделы MSDN, касайющиеся десктоп и светофоров. Для удобства приведу тут код двух программ, для блокировки и соответственно разблокировки.<br>
<br>
Блокировщик:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Sub Main()</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dim hSemaphore As Long, hDesktop As Long</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dim hOldDesktop As Long</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Создаем семафор</div><div class="code_line">&nbsp;&nbsp; &nbsp;hSemaphore = CreateSemaphore(0, 0, 10, SEMAPHORE_NAME)</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Узнаем, какой сейчас десктоп</div><div class="code_line">&nbsp;&nbsp; &nbsp;hOldDesktop = GetThreadDesktop(GetCurrentThreadId)</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Создаем новый десктоп</div><div class="code_line">&nbsp;&nbsp; &nbsp;hDesktop = CreateDesktopA(DESKTOP_NAME, 0, 0, 0, GENERIC_ALL, 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp;If hDesktop &#60;&#62; 0 Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Переключаемся в новый десктоп</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SwitchDesktop hDesktop</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Dim sti As STARTUPINFO, spi As PROCESS_INFORMATION</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sti.cb = Len(sti)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sti.lpDesktop = DESKTOP_NAME</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Запускаем VMWare или чтото еще...</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CreateProcess WMWARE_EXECUTABLE_NAME, &quot;&quot;, 0&amp;, 0&amp;, 0, NORMAL_PRIORITY_CLASS, ByVal 0&amp;, CurDir, sti, spi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Ждем его закрытия</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WaitForSingleObject spi.hProcess, -1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Запускаем &quot;анлокер&quot;. Если он вдруг не запустится, пеняйте на себя :)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CreateProcess App.Path &amp; &quot;\WaitForShutdown.exe&quot;, &quot;&quot;, 0&amp;, 0&amp;, 0, NORMAL_PRIORITY_CLASS, ByVal 0&amp;, CurDir, sti, spi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Ждем, когда загорится семафор</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Call WaitForSingleObject(hSemaphore, -1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Сворачиваем лавочку: закрываем дескрипторы и переключаемся в обычный десктоп</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CloseHandle hSemaphore</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SwitchDesktop hOldDesktop</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CloseDesktop hDesktop</div><div class="code_line">&nbsp;&nbsp; &nbsp;Else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MsgBox &quot;Can&#39;t create desktop&quot; &amp; vbCrLf &amp; Err.LastDllError</div><div class="code_line">&nbsp;&nbsp; &nbsp;End If</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseDesktop hOldDesktop</div><div class="code_line">End Sub</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<br>
Разблокировщик:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Dim hSemaphore As Long</div><div class="code_line">&nbsp;</div><div class="code_line">Private Sub cmdOK_Click()</div><div class="code_line">&nbsp;&nbsp; &nbsp;If txtPwd.Text = &quot;AAA&quot; Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Если пароль правильный</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;Уменьшим семафор</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReleaseSemaphore hSemaphore, 2, 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CloseHandle hSemaphore</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;И выходим</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;End</div><div class="code_line">&nbsp;&nbsp; &nbsp;Else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MsgBox &quot;You type wrong password!&quot;, vbExclamation</div><div class="code_line">&nbsp;&nbsp; &nbsp;End If</div><div class="code_line">End Sub</div><div class="code_line">&nbsp;</div><div class="code_line">Private Sub Form_Load()</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Пытаемся открыть семафор</div><div class="code_line">&nbsp;&nbsp; &nbsp;hSemaphore = OpenSemaphore(GENERIC_ALL, 0, SEMAPHORE_NAME)</div><div class="code_line">&nbsp;&nbsp; &nbsp;If hSemaphore = 0 Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MsgBox &quot;Can&#39;t open semaphore&quot;, vbCritical</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;End</div><div class="code_line">&nbsp;&nbsp; &nbsp;End If</div><div class="code_line">End Sub</div></ol></div></div></div></div>]]></description>
        <author>ANDLL</author>
        <category>Работа с Windows</category>
      </item>
	
      </channel>
      </rss>
	