Winforms 带Powershell的全局(系统范围)热键

Winforms 带Powershell的全局(系统范围)热键,winforms,powershell,hotkeys,global-hotkey,Winforms,Powershell,Hotkeys,Global Hotkey,我有一个WinFormWaitng在后面,我想让它出现一个全局(系统范围)热键。(请参阅下面的伪“新热键”-cmdlet) 我在网上进行了大量搜索,但只找到了C#解决方案,我无法将其转换为powershell(v3) 谢谢你,Rob我认为如果没有C#代码,你无论如何都无法做到这一点。您可以创建一个自定义表单子类,并使用Add Type加载它(这可能与您已经找到的示例相匹配),然后从PowerShell脚本中使用该表单类。实现像新的热键cmdlet这样的东西会有点复杂,但应该是可能的。谢谢,但你误

我有一个WinFormWaitng在后面,我想让它出现一个全局(系统范围)热键。(请参阅下面的伪“新热键”-cmdlet) 我在网上进行了大量搜索,但只找到了C#解决方案,我无法将其转换为powershell(v3)


谢谢你,Rob

我认为如果没有C#代码,你无论如何都无法做到这一点。您可以创建一个自定义表单子类,并使用Add Type加载它(这可能与您已经找到的示例相匹配),然后从PowerShell脚本中使用该表单类。实现像新的热键cmdlet这样的东西会有点复杂,但应该是可能的。谢谢,但你误解了:我不需要它作为cmdlet,我也不反对在脚本中包含c代码。我只是不知道怎么做……这个博客会让你开始:不幸的是,它不会。我去过那里,试图实现我发现的一些c代码。问题是,因为我不能C#,我不能判断代码是否有效以及可能出现的错误。看看这里发生了什么:您需要学习更多关于C#和Windows消息(Win32 API)的知识才能使其正常工作,而让PowerShell代码执行以响应Win32消息并不是一项简单的任务。我能想到的最简单的方法是编写一个.NET类(Form的子类)来引发一个事件来响应消息,以及使用Register ObjectEvent来响应此消息的PowerShell代码。但是,如果您已经费劲地编写了一个新的Form子类,那么您可能只想在C#中响应消息。
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$form1 = New-Object 'System.Windows.Forms.Form'
$form1.ClientSize = '300, 250'
$form1.windowstate = "minimized"

# -- bogus code --
$hk = new-hotkey -scope Global -keys "Ctrl,Shift,Z" -action ({$form1.windowstate = "normal" })
# ----------------

$form1.ShowDialog()