我遇到一个问题,即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。
谢谢!
编辑:错别字
答案 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);
脚本将不再崩溃