[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 求教powershell如何调用api函数

本人最近在写远程批量关闭应用的脚本,由于该应用不可强杀,需要触发其关闭后输入密码,故问题主要集中在输入密码及焦点聚焦到程序上两个问题。
输入密码我调用sendkeys解决,而激活程序,将焦点切换到密码的输入框这块却解决不了(我有尝试过vbs的appactivate但是仅在本机操作时生效,远程触发只会让任务栏闪烁,窗口不会被弹出)
经大佬指路,可以尝试使用函数
GetForegroundWindow 获取当前窗口
SetWindowPos 激活指定窗口
但苦于本人毫无api基础,故诚心请教,有其它思路亦可,感谢感谢!

  1. https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.utility/add-type?#4-windows-api
复制代码

TOP

既然都用win32api了 何必再用不靠谱的sendkeys呢

TOP

查了下GetForegroundWindow和SetWindowPos说明
这两个都是需要作为前台线程调用的,不然的话也是闪烁或者什么都不干
貌似还得AttachThreadInput,但不知道这个能否跨进程使用
还有个SwitchToThisWindow,不是公开的,不知道还能不能用

建议还是试试模拟alt+tab之类的 , 或者尝试以前台线程运行原来的 , 说不定vbs的appactivate内部使用的是GetForegroundWindow,由于执行时不是前台线程导致闪烁(???)

TOP

解决不了就用现成的第三方 (http://bcn.bathome.net/s/tool/index.html)某些软件或者以管理员权限启动的软件,可能需用管理员权限执行批处理。
以下为我自用代码摘选。
  1. @fltmc>nul||mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~dpnx0","%*",,"runas",1)(window.close)&&exit
  2. rem 缩小及移动cmd窗口,防止干扰
  3. @echo off &mode con cols=40 lines=2 & color 0f
  4. cmdow @ /mov 0 0
  5. CurS /crv 0
  6. rem 获取完整标题
  7. for /f "tokens=12*" %%a in ('cmdow /f /t /p ^|find "部分软件名"') do (
  8. set window_xx=%%b
  9. )
  10. rem 显示并置顶(偶尔会失败,可执行两次)
  11. cmdow "%window_xx%" /res /top
  12. cmdow "%window_xx%" /res /top
  13. rem 使用cimt模拟键盘鼠标
  14. rem 取消置顶,最小化
  15. cmdow "%window_xx%" /not /min
复制代码
bat小白,请多指教!谢谢!

TOP

返回列表