/*____________________________________________
[ 输入法信息安装卸载 NSIS 实用函数 ]
< 头文件: IMEfunc.nsh >
By Engine @ bbs.hanzify.org 2006
Email: hesung at qq.com
* 提供一个通用宏,和两个函数(分别用于安装段落和卸载段落中)调用…
(1) 宏 InstallIME ( 不需要预声明 )
(2) 函数 RemoveIME ( 需要预声明 )
(3) 函数 un.RemoveIME ( 需要预声明 )
______________________________________________
*/
#####################################################################
## 使用说明: ##
#################
#——————————————————————
# 注册输入法功能部分:
# 宏 InstallIME ( 不需要预声明 )
#——————————————————————
# 用法:
/****************************
#; 在你的脚本开头包含头文件
!include "IMEfunc.nsh"
#; 在需要的地方插入宏:
!insertmacro InstallIME "输入法ime文件绝对路径" "输入法描述文本"
;; 例如:
!insertmacro InstallIME "$SYSDIR\unispim.ime" "紫光拼音输入法3.0"
*****************************/
#——————————————————————
# 反注册输入法功能部分:
# 函数 RemoveIME ( 需要预声明 )
# 函数 un.RemoveIME ( 需要预声明 )
#——————————————————————
# 用法:
/****************************
#; 在你的脚本开头包含头文件:
!include "IMEfunc.nsh"
#; 紧接着必须声明用到的函数: (声明卸载程序函数是 ${un.RemoveIME})
${RemoveIME}
#; 函数调用方法:
Push “输入法ime文件名”
Call RemoveIME
#; 然后应该是一系列删除文件的代码…
*****************************/
# 例如:
/****************************
Push "unispim.ime" Call RemoveIME DetailPrint `反注册 $\"紫光拼音输入法3.0$\" 完成...` ;; 你自己的一系列删除清理操作.. ; Delete "$SYSDIR\unispim.ime" ; Delete "$SYSDIR\upengine.dll" ; RMDir /r "$SYSDIR\IME\Unispim" ; RMDir /r "$APPDATA\Unispim" ;; 清理一些注册表项目,等等...
*****************************/
#####################################################################
;<IMEfunc.nsh> 开始... !ifndef INC.UNINSTALLIMEFUNC.NSH !define INC.UNINSTALLIMEFUNC.NSH !verbose push !verbose 3 !include "logiclib.nsh" ;------------------------------------ !macro InstallIME ARG_IME_FILE ARG_IME_TEXT IfFileExists ${ARG_IME_FILE} +3 DetailPrint "注册输入法信息失败:找不到文件$\"${ARG_IME_FILE}$\"。" ;; 主要用于安装程序调试过程... Abort System::Call 'imm32::ImmInstallIME(t `${ARG_IME_FILE}` ,t `${ARG_IME_TEXT}`)' DetailPrint `注册 $\"${ARG_IME_TEXT}$\" 完成...` !macroend ;------------------------------------ !define RemoveIME `!insertmacro DEF_FUNC_RemoveIME ""` !define un.RemoveIME `!insertmacro DEF_FUNC_RemoveIME "un."` !define INC.USEFULLIB.NSH
/***
附加说明:
下面“ 清理输入法热键信息部分” 使用到了
蓝色网际函数库 Usefullib.nsh 中的 ReadRegBin 函数。
如当前你的NSIS\include目录中没有Usefullib.nsh,可以尝试这个链接下载
http://forums.winamp.com/attachment.php?s=&postid=2015251
如果不暂时不方便获取,可以先将上面 !define INC.USEFULLIB.NSH 注释掉…
***/
################################
!ifdef INC.USEFULLIB.NSH !echo "需要包含蓝色网际的实用函数库文件 Usefullib.nsh ..." !include "Usefullib.nsh" !endif !define HKCU_PRELAOD_TEMPKEY `Keyboard Layout\UninstallTempkey` !define HKML_KEYBOARD_LAYOUT `SYSTEM\CurrentControlSet\Control\Keyboard Layouts` !define HKML_WINDOWS_VERSION `SOFTWARE\Microsoft\Windows NT\CurrentVersion` !define HKCU_IME_HOTKEYS `Control Panel\Input Method\Hot Keys` !macro DEF_FUNC_RemoveIME ARG_UNFIX !ifdef INC.USEFULLIB.NSH ${${ARG_UNFIX}ReadRegBin} ;;声明usefullib.nsh中的函数 !endif Function ${ARG_UNFIX}RemoveIME Exch $R0 ;;要卸载的IME Push $R1 Push $R2 ;;KBlayout码 Push $R3 StrCpy $R1 0 ${Do} EnumRegKey $R2 HKLM "${HKML_KEYBOARD_LAYOUT}" $R1 ${IfThen} $R2 == "" ${|} Goto TheEnd ${|} ReadRegStr $R3 HKLM "${HKML_KEYBOARD_LAYOUT}\$R2" "IME file" ${IfThen} $R3 == $R0 ${|} ${ExitDo} ${|} IntOp $R1 $R1 + 1 ${Loop} StrCpy $R1 "0x$R2" System::Call "User32::UnloadKeyboardLayout(i R1) i .R0" DeleteRegKey HKLM "${HKML_KEYBOARD_LAYOUT}\$R2" StrCpy $R1 1 ${DO} ReadRegStr $R0 HKLM "SYSTEM\ControlSet00$R1\Control" "CurrentUser" ${IfThen} $R0 == "" ${|} ${ExitDo} ${|} DeleteRegKey HKLM "SYSTEM\ControlSet00$R1\Control\Keyboard Layouts\$R2" IntOp $R1 $R1 + 1 ${Loop} ;;调用TrimPreload处理托盘项目 Call ${ARG_UNFIX}TrimPreload !ifdef INC.USEFULLIB.NSH ;;清理输入法热键信息 StrCpy $R0 "" ${ForEach} $R3 0 6 + 2 StrCpy $R1 $R2 2 $R3 StrCpy $R0 "$R1$R0" ${Next} ;;转换编码方式 StrCpy $R1 0 ${Do} EnumRegKey $R3 HKCU "${HKCU_IME_HOTKEYS}" $R1 ${IfThen} $R3 == "" ${|} ${ExitDo} ${|} ${${ARG_UNFIX}ReadRegBin} $R2 ${HKCU} "${HKCU_IME_HOTKEYS}\$R3" "Target IME" ${If} $R2 == $R0 DeleteRegKey HKCU "${HKCU_IME_HOTKEYS}\$R3" ${ExitDo} ${EndIf} IntOp $R1 $R1 + 1 ${Loop} !endif TheEnd: Pop $R3 Pop $R2 Pop $R1 Pop $R0 FunctionEnd # X. 函数 TrimPreload : # X. RemoveIME 的子函数清理输入法预加载-注册表项残余... Function ${ARG_UNFIX}TrimPreload Push $0 Push $1 Push $2 Push $3 Push $4 ;KBlayout Push $5 ;Counter Push $6 ;HKL Push $7 ;HIWORD Push $8 ;LangID Push $9 ;DefaultLangID Push $R0 ;Windows Version SetPluginUnload alwaysoff System::Call 'user32::GetKeyboardLayout(i 0)i.r0' IntFmt $0 "%08x" $0 StrCpy $9 $0 "" -4 System::Call 'user32::GetKeyboardLayoutList(i 0, i 0) i .r3' IntOp $3 $3 * 4 System::Alloc $3 Pop $2 System::Call 'user32::GetKeyboardLayoutList(i r3, i r2) i .r0' IntCmp 1 $0 0 0 TheEnd ClearErrors ReadRegStr $R0 HKLM "${HKML_WINDOWS_VERSION}" CurrentVersion IfErrors 0 +2 StrCpy $R0 "Win9X" DeleteRegKey HKCU "Keyboard Layout\Preload" DeleteRegKey HKCU "Keyboard Layout\Substitutes" IntOp $3 $2 + $3 IntOp $3 $3 - 4 ${ForEach} $2 $2 $3 + 4 System::Call '*$2(i .r0)' IntFmt $6 "%08x" $0 StrCpy $8 $6 "" -4 StrCpy $7 $6 4 ReadRegStr $5 HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" "" IntOp $5 $5 + 1 ${If} $8 == $7 StrCpy $4 "0000$8" WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" "" $5 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" $5 $4 ${Continue} ${EndIf} StrCpy $0 $6 1 ${Switch} $0 ${Case} 'e' StrCpy $4 $6 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" "" $5 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" $5 $4 ${Break} ${Case} 'f' IntOp $7 0x$7 & 0x0fff IntFmt $7 "%04x" $7 StrCpy $1 0 ${Do} EnumRegKey $4 HKLM "${HKML_KEYBOARD_LAYOUT}" $1 ${IfThen} $4 == "" ${|} ${ExitDo} ${|} ReadRegStr $0 HKLM "${HKML_KEYBOARD_LAYOUT}\$4" "Layout Id" ${IfThen} $0 == $7 ${|} Goto Default ${|} IntOp $1 $1 + 1 ${Loop} ${Break} ${CaseElse} StrCpy $4 "0000$6" 8 Default: ReadRegStr $0 HKCU "${HKCU_PRELAOD_TEMPKEY}\$8" "" IntOp $1 0x$0 + 0xd000 IntFmt $1 "%04x" $1 IntOp $0 $0 + 1 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8" "" $0 ${If} $R0 == "Win9X" WriteRegStr HKCU "Keyboard Layout\Substitutes\$1$8" "" $4 ${Else} WriteRegStr HKCU "Keyboard Layout\Substitutes" "$1$8" $4 ${EndIf} WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" "" $5 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" $5 "$1$8" ${EndSwitch} ${Next} StrCpy $1 1 ${Do} ${If} $1 == 1 StrCpy $8 $9 ${Else} EnumRegKey $8 HKCU "${HKCU_PRELAOD_TEMPKEY}" 0 ${If} $8 == "" DeleteRegKey HKCU "${HKCU_PRELAOD_TEMPKEY}" ${ExitDo} ${EndIf} ${EndIf} ReadRegStr $5 HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" "" ${For} $0 1 $5 ReadRegStr $6 HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" $0 ${If} $R0 == "Win9X" WriteRegStr HKCU "Keyboard Layout\Preload\$1" "" $6 ${Else} WriteRegStr HKCU "Keyboard Layout\Preload" $1 $6 ${EndIf} IntOp $1 $1 + 1 ${Next} DeleteRegKey HKCU "${HKCU_PRELAOD_TEMPKEY}\$8" ${Loop} TheEnd: SetPluginUnload manual System::Free $0 Pop $R0 Pop $9 Pop $8 Pop $7 Pop $6 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 FunctionEnd !macroend # DEF_FUNC_RemoveIME !verbose pop !endif # INC.UNINSTALLIMEFUNC.NSH ;复制保存为保存为IMEfunc.nsh