You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell注册热键遇错误码1004(无效属性)求助

解决RegisterHotKey注册Ctrl+Alt+M热键时错误码1004的问题

错误码1004(无效属性)的核心原因是参数误用:RegisterHotKey的fsModifiers参数需要的是修饰符标志常量,但你传入的是[System.Windows.Forms.Keys]枚举里的按键虚拟键码,两者取值不匹配。

正确的修饰符常量定义

RegisterHotKey要求的修饰符常量是user32.dll预定义的:

  • Ctrl键修饰符:MOD_CONTROL = 0x0002
  • Alt键修饰符:MOD_ALT = 0x0001

修正后的代码

# 先加载System.Windows.Forms程序集(如果未加载)
Add-Type -AssemblyName System.Windows.Forms

Add-Type -TypeDefinition @"
using System;
using System.Text;
using System.Runtime.InteropServices;
namespace User32{
    public static class NativeMethods{
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
        
        [DllImport("Kernel32.dll")]
        public static extern int GetLastError();
        
        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        public static extern int FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, [Out]StringBuilder lpBuffer, uint nSize, IntPtr Arguments);
    }
}
"@ -passthru

# 使用正确的修饰符常量
$modifierCtrl = 0x0002
$modifierAlt = 0x0001
# M键的虚拟键码是对的,转成uint类型适配参数要求
$keyM = [uint][System.Windows.Forms.Keys]::M

[int]$hotkey_ID = 1

$hotkey_registered = [User32.NativeMethods]::RegisterHotKey([System.IntPtr]::Zero, $hotkey_id, $modifierCtrl -bor $modifierAlt, $keyM)

if (-not $hotkey_registered)
{
    $errorCode = [User32.NativeMethods]::GetLastError()
    $errorMsg = New-Object System.Text.StringBuilder(255)
    [User32.NativeMethods]::FormatMessage(0x00001000, [IntPtr]::Zero, $errorCode, 0, $errorMsg, $errorMsg.Capacity, [IntPtr]::Zero) | Out-Null
    Write-Host "Failed to register hotkey. Error code: $errorCode Error message: $($errorMsg.ToString().Trim())"
}

额外注意事项

  1. 热键注册成功后,需要启动消息循环捕获WM_HOTKEY消息,否则按下Ctrl+Alt+M不会触发响应逻辑,可通过System.Windows.Forms.Application.Run()实现。
  2. 确保热键ID($hotkey_ID)唯一,避免与其他程序注册的热键冲突。
  3. 程序退出时调用UnregisterHotKey释放热键资源,避免资源泄漏。

内容的提问来源于stack exchange,提问作者crdy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:52:44