SendMessage вызывает зависание скрипта - PullRequest
4 голосов
/ 27 марта 2012

У меня проблема с тем, что функция SendMessage () вызывает зависание скрипта и, следовательно, никогда не завершается, хотя он и запускает SendMessage, как и должно (его задача завершается).Есть ли способ обойти это, потому что я чертовски потратил время, убивая его из основного сценария.

Stop-job -name offmon

или

Remove-job -name offmon -force

не убьет его.Без силы на удаление-задание оно сообщает, что не может убить его, потому что оно не завершено.

Мне нужно вызывать это много раз в день, и каждый раз, когда я делаю это, появляется новый powershell.exe, съедающий около 30M.памяти.

Примечание: код перевернет ваши мониторы, если вы запустите его, и "@ должно быть в начале строки (не можете перевернуть его, чтобы хорошо выглядеть).

start-job -Name offmon -ScriptBlock { 
$HWND = -1
$WM_SYSCOMMAND = 0x0112
$SC_MONITORPOWER = 0xF170
$MONITOR_ON = -1
$MONITOR_OFF = 2
#Store the C# signature of the SendMessage function. 
$signature = @"
[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);
"@
#Add the SendMessage function as a static method of a class
$SendMessage = Add-Type -MemberDefinition $signature -Name "Win32SendMessage" -Namespace Win32Functions -PassThru
#Invoke the SendMessage Function
$SendMessage::SendMessage($HWND, $WM_SYSCOMMAND, $SC_MONITORPOWER, $MONITOR_OFF)
exit}

Также это зависает точно так же, без запуска задания, поэтому я не верю, что это связано с запуск задания вызывает зависание сценариев. Поддержка MS . Далее этоWin7Ent / 2008R2.

Спасибо!

Редактировать: Опечатки

Ответы [ 3 ]

4 голосов
/ 18 июня 2012

Измените SendMessage на PostMessage.Это сработало для меня.

Разница в том, что PostMessage это асинхронный , и ему не нужно ждать ответа.

1 голос
/ 29 декабря 2018

Краткая версия этого скрипта в виде команды пакетного файла (поместите эту строку в файл .bat):

@ powershell (Add-Type '[DllImport (\ "user32.dll \")] ^ public static extern int PostMessage (int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas): : PostMessage (-1,0x0112,0xF170,2)

0 голосов
/ 20 мая 2015

Пожалуйста, добавьте

Add-Type -Assembly UIAutomationClient

и используйте

public static extern IntPtr PostMessage(int hWnd, UInt32 hMsg, Int32 wParam, Int32 lParam);

или

public static extern IntPtr SendMessage(int hWnd, UInt32 hMsg, Int32 wParam, Int32 lParam);

И скрипт больше не будет зависать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...