1

(この質問は、Delphi: How to response to WM_SettingChange/WM_WinIniChange? に似ていますが、AutoHotKey言語に関するものです。これは、AutoHotKey 内から WM_SETTINGCHANGE を送信することに関するものではありません。)

別の Windows プロセス (「送信者」) で、HK_CURRENT_USER レジストリを変更して PATH 環境変数を変更します。次に、SendMessageTimeout API を使用して WM_SETTINGCHANGE メッセージを送信/発行します。

プログラムランチャーとして使用している、同時に実行している AutoHotKey スクリプト (「レシーバー」) は、変更を認識していないようです。スクリプトの PATH 変数のローカル コピーを更新するために、このメッセージをキャプチャしたいと考えています。出来ますか?

たとえば、「送信者」は、[システム プロパティ] ダイアログ ボックス、または別の AutoHotKey スクリプトである可能性があります。

EnvUpdate

またはnircmdのような他の便利なサードパーティ Windows バイナリ:

nircmd sysrefresh environment

またはいくつかのRuby コード:

### This is a -*- ruby -*- script
require 'Win32API'

module Windows::EnvByReg
  def self.envupdate()
    result = 0
    wParam_unused = 0
    timeout_ms = 5000
    SendMessageTimeout.call(HWND_BROADCAST, WM_SETTINGCHANGE,
                            wParam_unused, 'Environment',
                            SMTO_ABORTIFHUNG, timeout_ms, result)
  end
  SendMessageTimeout = Win32API.new('user32', 'SendMessageTimeout',
                                    'LLLPLLP', 'L') 
  HWND_BROADCAST = 0xffff
  WM_SETTINGCHANGE = 0x001A
  SMTO_ABORTIFHUNG = 2
end#module

if __FILE__ == $PROGRAM_NAME
   Windows::EnvByReg.envupdate
end
4

2 に答える 2

1

メッセージに応答するには、 OnMessage関数を使用します。

サンプル スクリプトを次に示します。

;;; This is an AutoHotKey -*- ahk -*- script 
;;;
;;; ABOUT
;;;  Respond to WM_SETTINGCHANGE messages and update this process's PATH
;;;  environment variable.
;;;
;;; USAGE
;;;  Run the script directly (e.g. double-click) or drag and drop onto
;;;  the AutoHotKey application.
;;;
;;; DEBUG
;;;  Optionally define a key binding to debug_show_recv_count, e.g.:
;;;    #space:: debug_show_recv_count()
;;;
;;; AUTHOR
;;;  piyo @ StackOverflow
;;;

;;
;; Register an AHK function as a callback.
;;
OnMessage( (WM_SETTINGCHANGE:=0x1A), "recv_WM_SETTINGCHANGE")

;;
;; Respond to the WM_SETTINGCHANGE message.
;;
recv_WM_SETTINGCHANGE(wParam, lParam, msg, hwnd)
{
  global g_recv_WM_SETTINGCHANGE_count
  g_recv_WM_SETTINGCHANGE_count := g_recv_WM_SETTINGCHANGE_count + 1
  ;;debug;; ToolTip Received a WM_SETTINGCHANGE !
  reset_env_path_from_registry()
}

;;
;; Import the recently changed Path environment variable from the
;; Windows Registry. Import from the System and User environments.
;;
reset_env_path_from_registry()
{
  sys_path := ""
  sys_subkey := "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
  RegRead, sys_path, HKEY_LOCAL_MACHINE, %sys_subkey%, Path
  cu_path := ""
  cu_subkey := "Environment"
  RegRead, cu_path, HKEY_CURRENT_USER, %cu_subkey%, Path
  new_path := sys_path . ";" . cu_path
  ;;debug;; MsgBox,% new_path
  EnvSet, PATH,% new_path
}

;;;

; Debug var for interactive sanity checking
g_recv_WM_SETTINGCHANGE_count := 0

; Debug function for interactive sanity checking
debug_show_recv_count() {
  global g_recv_WM_SETTINGCHANGE_count
  path := ""
  EnvGet, path, PATH
  msg := "g_recv_WM_SETTINGCHANGE := " . g_recv_WM_SETTINGCHANGE_count
  msg := msg . "!`n" . path
  MsgBox,% msg
}

;;; end
于 2010-08-12T03:39:22.933 に答える