SendMessage导致脚本挂起

时间:2012-03-27 14:28:34

标签: powershell powershell-v2.0

我遇到一个问题,即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}

如果没有开始工作,这也是一样的,所以我不相信它与start-job causes scripts to hang. MS Support有关。此外,这是Win7Ent / 2008R2。

谢谢!

编辑:错别字

3 个答案:

答案 0 :(得分:4)

SendMessage更改为PostMessage。它对我有用。

区别在于PostMessage 异步,并且不必等待任何响应。

答案 1 :(得分:1)

此脚本的简短版本作为批处理文件命令(将此行放入.bat文件中):

@powershell(添加类型'[DllImport(\“ user32.dll \”)] ^^公共静态外部int PostMessage(int hWnd,int hMsg,int wParam,int lParam);'-名称a -Pas): :PostMessage(-1,0x0112,0xF170,2)

答案 2 :(得分:0)

请添加

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);

脚本将不再崩溃