杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2391|回复: 0

NSIS 输入法头文件

[复制链接]
发表于 2017-2-26 11:36:40 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. /*____________________________________________


  2.    [ 输入法信息安装卸载 NSIS 实用函数 ]
  3.       < 头文件: IMEfunc.nsh >

  4.    
  5.    By Engine @ bbs.hanzify.org  2006
  6.    
  7. Email: hesung at qq.com



  8.   * 提供一个通用宏,和两个函数(分别用于安装段落和卸载段落中)调用...

  9.   (1) 宏 InstallIME ( 不需要预声明 )
  10.   (2) 函数 RemoveIME ( 需要预声明 )
  11.   (3) 函数 un.RemoveIME ( 需要预声明 )

  12. ______________________________________________
  13. */

  14. #####################################################################
  15. ##  使用说明: ##
  16. #################

  17. #------------------------------------------------------------------
  18. # 注册输入法功能部分:
  19. # 宏 InstallIME ( 不需要预声明 )
  20. #------------------------------------------------------------------

  21. # 用法:
  22. /****************************
  23. #; 在你的脚本开头包含头文件
  24. !include "IMEfunc.nsh"


  25. #; 在需要的地方插入宏:
  26. !insertmacro InstallIME "输入法ime文件绝对路径" "输入法描述文本"

  27. ;; 例如: !insertmacro InstallIME "$SYSDIR\unispim.ime" "紫光拼音输入法3.0"
  28. *****************************/


  29. #------------------------------------------------------------------
  30. # 反注册输入法功能部分:
  31. # 函数 RemoveIME ( 需要预声明 )
  32. # 函数 un.RemoveIME ( 需要预声明 )
  33. #------------------------------------------------------------------

  34. # 用法:
  35. /****************************
  36. #; 在你的脚本开头包含头文件:
  37. !include "IMEfunc.nsh"

  38. #; 紧接着必须声明用到的函数: (声明卸载程序函数是 ${un.RemoveIME})
  39. ${RemoveIME}

  40. #; 函数调用方法:
  41. Push "输入法ime文件名"
  42. Call RemoveIME

  43. #; 然后应该是一系列删除文件的代码...
  44. *****************************/

  45. # 例如:
  46. /****************************
  47. Push "unispim.ime"
  48. Call RemoveIME
  49. DetailPrint `反注册 $"紫光拼音输入法3.0$" 完成...`

  50. ;; 你自己的一系列删除清理操作..
  51. ; Delete "$SYSDIR\unispim.ime"
  52. ; Delete "$SYSDIR\upengine.dll"
  53. ; RMDir /r "$SYSDIR\IME\Unispim"
  54. ; RMDir /r "$APPDATA\Unispim"
  55. ;; 清理一些注册表项目,等等...
  56. *****************************/


  57. #####################################################################



  58. ;<IMEfunc.nsh> 开始...



  59. !ifndef INC.UNINSTALLIMEFUNC.NSH
  60. !define INC.UNINSTALLIMEFUNC.NSH

  61. !verbose push
  62. !verbose 3

  63. !include    "logiclib.nsh"

  64. ;------------------------------------


  65. !macro InstallIME ARG_IME_FILE ARG_IME_TEXT

  66. IfFileExists ${ARG_IME_FILE} +3
  67.   DetailPrint "注册输入法信息失败:找不到文件$"${ARG_IME_FILE}$"。"
  68.   ;; 主要用于安装程序调试过程...
  69.   Abort
  70. System::Call 'imm32::ImmInstallIME(t `${ARG_IME_FILE}` ,t `${ARG_IME_TEXT}`)'
  71. DetailPrint `注册 $"${ARG_IME_TEXT}$" 完成...`

  72. !macroend


  73. ;------------------------------------


  74. !define RemoveIME `!insertmacro DEF_FUNC_RemoveIME ""`
  75. !define un.RemoveIME `!insertmacro DEF_FUNC_RemoveIME "un."`

  76. ################################
  77. !define INC.USEFULLIB.NSH

  78. /***
  79. 附加说明:

  80. 下面“ 清理输入法热键信息部分” 使用到了
  81. 蓝色网际函数库 Usefullib.nsh 中的 ReadRegBin 函数。

  82. 如当前你的NSIS\include目录中没有Usefullib.nsh,可以尝试这个链接下载
  83. http://forums.winamp.com/attachment.php?s=&postid=2015251
  84. 如果不暂时不方便获取,可以先将上面 !define INC.USEFULLIB.NSH 注释掉...
  85. ***/
  86. ################################

  87. !ifdef INC.USEFULLIB.NSH
  88. !echo "需要包含蓝色网际的实用函数库文件 Usefullib.nsh ..."
  89. !include "Usefullib.nsh"
  90. !endif

  91. !define HKCU_PRELAOD_TEMPKEY `Keyboard Layout\UninstallTempkey`
  92. !define HKML_KEYBOARD_LAYOUT `SYSTEM\CurrentControlSet\Control\Keyboard Layouts`
  93. !define HKML_WINDOWS_VERSION `SOFTWARE\Microsoft\Windows NT\CurrentVersion`
  94. !define HKCU_IME_HOTKEYS     `Control Panel\Input Method\Hot Keys`

  95. !macro DEF_FUNC_RemoveIME ARG_UNFIX

  96. !ifdef INC.USEFULLIB.NSH
  97.   ${${ARG_UNFIX}ReadRegBin} ;;声明usefullib.nsh中的函数
  98. !endif

  99. Function ${ARG_UNFIX}RemoveIME

  100.     Exch $R0 ;;要卸载的IME
  101.     Push $R1
  102.     Push $R2 ;;KBlayout码
  103.     Push $R3

  104.         StrCpy $R1 0
  105.         ${Do}
  106.             EnumRegKey $R2 HKLM "${HKML_KEYBOARD_LAYOUT}" $R1
  107.                 ${IfThen} $R2 == "" ${|} Goto TheEnd ${|}
  108.             ReadRegStr $R3 HKLM "${HKML_KEYBOARD_LAYOUT}\$R2" "IME file"
  109.                 ${IfThen} $R3 == $R0 ${|} ${ExitDo} ${|}
  110.             IntOp $R1 $R1 + 1
  111.         ${Loop}
  112.         StrCpy $R1 "0x$R2"
  113.         System::Call "User32::UnloadKeyboardLayout(i R1) i .R0"

  114.         DeleteRegKey HKLM "${HKML_KEYBOARD_LAYOUT}\$R2"
  115.         StrCpy $R1 1
  116.         ${DO}
  117.             ReadRegStr $R0 HKLM "SYSTEM\ControlSet00$R1\Control" "CurrentUser"
  118.                 ${IfThen} $R0 == "" ${|} ${ExitDo} ${|}
  119.             DeleteRegKey HKLM "SYSTEM\ControlSet00$R1\Control\Keyboard Layouts\$R2"
  120.             IntOp $R1 $R1 + 1
  121.         ${Loop}

  122.         ;;调用TrimPreload处理托盘项目
  123.         Call ${ARG_UNFIX}TrimPreload

  124.         !ifdef INC.USEFULLIB.NSH
  125.         ;;清理输入法热键信息
  126.             StrCpy $R0 ""
  127.             ${ForEach} $R3 0 6 + 2
  128.                     StrCpy $R1 $R2 2 $R3
  129.                     StrCpy $R0 "$R1$R0"
  130.             ${Next} ;;转换编码方式

  131.             StrCpy $R1 0
  132.             ${Do}
  133.                 EnumRegKey $R3 HKCU "${HKCU_IME_HOTKEYS}" $R1
  134.                     ${IfThen} $R3 == "" ${|} ${ExitDo} ${|}
  135.                 ${${ARG_UNFIX}ReadRegBin} $R2 ${HKCU} "${HKCU_IME_HOTKEYS}\$R3" "Target IME"
  136.                     ${If} $R2 == $R0
  137.                         DeleteRegKey HKCU "${HKCU_IME_HOTKEYS}\$R3"
  138.                         ${ExitDo}
  139.                     ${EndIf}
  140.                 IntOp $R1 $R1 + 1
  141.             ${Loop}
  142.         !endif
  143.         TheEnd:

  144.     Pop $R3
  145.     Pop $R2
  146.     Pop $R1
  147.     Pop $R0

  148. FunctionEnd

  149. # X. 函数 TrimPreload :
  150. # X. RemoveIME 的子函数清理输入法预加载-注册表项残余...
  151. Function ${ARG_UNFIX}TrimPreload

  152.     Push $0
  153.     Push $1
  154.     Push $2
  155.     Push $3
  156.     Push $4 ;KBlayout
  157.     Push $5 ;Counter
  158.     Push $6 ;HKL
  159.     Push $7 ;HIWORD
  160.     Push $8 ;LangID
  161.     Push $9 ;DefaultLangID
  162.     Push $R0 ;Windows Version

  163. SetPluginUnload alwaysoff
  164.     System::Call 'user32::GetKeyboardLayout(i 0)i.r0'
  165.         IntFmt $0 "%08x" $0
  166.         StrCpy $9 $0 "" -4
  167.     System::Call 'user32::GetKeyboardLayoutList(i 0, i 0) i .r3'
  168.         IntOp $3 $3 * 4
  169.     System::Alloc $3
  170.         Pop $2
  171.     System::Call 'user32::GetKeyboardLayoutList(i r3, i r2) i .r0'
  172.         IntCmp 1 $0 0 0 TheEnd

  173.     ClearErrors
  174.     ReadRegStr $R0 HKLM "${HKML_WINDOWS_VERSION}" CurrentVersion
  175.         IfErrors 0 +2
  176.         StrCpy $R0 "Win9X"
  177.     DeleteRegKey HKCU "Keyboard Layout\Preload"
  178.     DeleteRegKey HKCU "Keyboard Layout\Substitutes"

  179.     IntOp $3 $2 + $3
  180.     IntOp $3 $3 - 4
  181.     ${ForEach} $2 $2 $3 + 4
  182.         System::Call '*$2(i .r0)'
  183.         IntFmt $6 "%08x" $0
  184.         StrCpy $8 $6 "" -4
  185.         StrCpy $7 $6 4
  186.             ReadRegStr $5 HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" ""
  187.             IntOp $5 $5 + 1
  188.         ${If} $8 == $7
  189.             StrCpy $4 "0000$8"
  190.             WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" "" $5
  191.             WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" $5 $4
  192.             ${Continue}
  193.         ${EndIf}
  194.         StrCpy $0 $6 1
  195.         ${Switch} $0
  196.             ${Case} 'e'
  197.                 StrCpy $4 $6
  198.                 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" "" $5
  199.                 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" $5 $4
  200.                 ${Break}
  201.             ${Case} 'f'
  202.                 IntOp $7 0x$7 & 0x0fff
  203.                 IntFmt $7 "%04x" $7
  204.                 StrCpy $1 0
  205.                 ${Do}
  206.                     EnumRegKey $4 HKLM "${HKML_KEYBOARD_LAYOUT}" $1
  207.                         ${IfThen} $4 == "" ${|} ${ExitDo} ${|}
  208.                     ReadRegStr $0 HKLM "${HKML_KEYBOARD_LAYOUT}\$4" "Layout Id"
  209.                         ${IfThen} $0 == $7 ${|} Goto Default ${|}
  210.                     IntOp $1 $1 + 1
  211.                 ${Loop}
  212.                 ${Break}
  213.             ${CaseElse}
  214.                 StrCpy $4 "0000$6" 8
  215.                 Default:
  216.                 ReadRegStr $0 HKCU "${HKCU_PRELAOD_TEMPKEY}\$8" ""
  217.                 IntOp $1 0x$0 + 0xd000
  218.                 IntFmt $1 "%04x" $1
  219.                 IntOp $0 $0 + 1
  220.                 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8" "" $0
  221.                 ${If} $R0 == "Win9X"
  222.                     WriteRegStr HKCU "Keyboard Layout\Substitutes\$1$8" "" $4
  223.                 ${Else}
  224.                     WriteRegStr HKCU "Keyboard Layout\Substitutes" "$1$8" $4
  225.                 ${EndIf}
  226.                 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" "" $5
  227.                 WriteRegStr HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" $5 "$1$8"
  228.         ${EndSwitch}
  229.     ${Next}

  230.     StrCpy $1 1
  231.     ${Do}
  232.         ${If} $1 == 1
  233.             StrCpy $8 $9
  234.         ${Else}
  235.             EnumRegKey $8 HKCU "${HKCU_PRELAOD_TEMPKEY}" 0
  236.             ${If} $8 == ""
  237.                 DeleteRegKey HKCU "${HKCU_PRELAOD_TEMPKEY}"
  238.                 ${ExitDo}
  239.             ${EndIf}
  240.         ${EndIf}
  241.         ReadRegStr $5 HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" ""
  242.         ${For} $0 1 $5
  243.             ReadRegStr $6 HKCU "${HKCU_PRELAOD_TEMPKEY}\$8\Preload" $0
  244.             ${If} $R0 == "Win9X"
  245.                 WriteRegStr HKCU "Keyboard Layout\Preload\$1" "" $6
  246.             ${Else}
  247.                 WriteRegStr HKCU "Keyboard Layout\Preload" $1 $6
  248.             ${EndIf}
  249.             IntOp $1 $1 + 1
  250.         ${Next}
  251.         DeleteRegKey HKCU "${HKCU_PRELAOD_TEMPKEY}\$8"
  252.     ${Loop}
  253.     TheEnd:
  254. SetPluginUnload manual
  255. System::Free $0
  256.    
  257.     Pop $R0
  258.     Pop $9
  259.     Pop $8
  260.     Pop $7
  261.     Pop $6
  262.     Pop $5
  263.     Pop $4
  264.     Pop $3
  265.     Pop $2
  266.     Pop $1
  267.     Pop $0

  268. FunctionEnd

  269. !macroend # DEF_FUNC_RemoveIME

  270. !verbose pop
  271. !endif # INC.UNINSTALLIMEFUNC.NSH



  272. ;复制保存为保存为IMEfunc.nsh
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-19 15:51 , Processed in 0.113380 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表