Project1

标题: 用脚本打不开名为汉字的文件夹的解决方法? [打印本页]

作者: px.凤翔九天    时间: 2010-11-7 18:32
标题: 用脚本打不开名为汉字的文件夹的解决方法?
本帖最后由 px.凤翔九天 于 2010-11-9 23:10 编辑

我想在游戏中打开一个文件夹,经调查用了以下脚本:
shell = Win32API.new("shell32", "ShellExecute", ['L', 'P', 'P', 'P', 'P', 'L'], 'L')
    shell.Call(0, "open", ".\\#{name}", 0, 0, 1)   
(那个name是变量...不解释)
但是问题来了,这个API调用后只能打开名字为字母和数字的文件夹,但是打不开名字为汉字的文件夹,这个原因是什么?请高手解答?
作者: 459645195    时间: 2010-11-7 19:16
哪你把文件夹改成英文嘛
作者: px.凤翔九天    时间: 2010-11-7 22:19
  1. =begin

  2.   脚本:【完美输入法修正】
  3.   
  4.   功能:输入法。
  5.   
  6.   说明: 直接用Type_Field创建输入域即可进行输入,在此可根据Type_Field域对象
  7.   
  8.         的活动标记active来自定义刷新等,在Type_Field中需要自己处理特殊按键
  9.         
  10.         的处理方法。具体不明白之处请参考范例工程。

  11.   作者:灼眼的夏娜
  12.   
  13.   补充: 至于以前那个版本也许很多人都注意到那个烦人的问题了吧,按Enter和Tab那
  14.   
  15.         些会出现不爽的声音,这个版本解决了那个问题,并简化添加了Type_Field类
  16.         
  17.         来方便创建输入域。

  18. =end

  19. #==============================================================================
  20. # ■ RInput
  21. #------------------------------------------------------------------------------
  22. #  全键盘处理的模块。
  23. #==============================================================================
  24. module RInput
  25.   
  26.   #--------------------------------------------------------------------------
  27.   # ● 常量定义
  28.   #--------------------------------------------------------------------------
  29.   ENTER             = 0x0D
  30.   SPACE             = 0x20
  31.   UP                = 0x26
  32.   DOWN              = 0x28
  33.   LEFT              = 0x25
  34.   RIGHT             = 0x27
  35.   
  36.   LCTRL             = 0xA2
  37.   LALT              = 0xA4

  38.   #--------------------------------------------------------------------------
  39.   # ● 临时Hash
  40.   #--------------------------------------------------------------------------
  41.   @R_Key_Hash = {}
  42.   @R_Key_Repeat = {}
  43.   
  44.   #--------------------------------------------------------------------------
  45.   # ● 唯一API
  46.   #--------------------------------------------------------------------------
  47.   GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I')

  48.   #--------------------------------------------------------------------------
  49.   # ● 单键处理
  50.   #--------------------------------------------------------------------------
  51.   def self.trigger?(rkey)
  52.     result = GetKeyState.call(rkey)
  53.     if @R_Key_Hash[rkey] == 1 and result != 0
  54.       return false
  55.     end
  56.     if result != 0
  57.       @R_Key_Hash[rkey] = 1
  58.       return true
  59.     else
  60.       @R_Key_Hash[rkey] = 0
  61.       return false
  62.     end
  63.   end

  64. end

  65. #==============================================================================
  66. # ■ EasyConv
  67. #------------------------------------------------------------------------------
  68. #  转码模块。
  69. #==============================================================================
  70. module EasyConv

  71.   #--------------------------------------------------------------------------
  72.   # ● 常量定义
  73.   #--------------------------------------------------------------------------
  74.   CP_ACP = 0
  75.   CP_UTF8 = 65001

  76.   #--------------------------------------------------------------------------
  77.   # ● 模块函数
  78.   #--------------------------------------------------------------------------
  79.   module_function
  80.   
  81.   #--------------------------------------------------------------------------
  82.   # ● 转码
  83.   #--------------------------------------------------------------------------
  84.   def s2u(text)

  85.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  86.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  87.     len = m2w.call(CP_ACP, 0, text, -1, nil, 0)
  88.     buf = "\0" * (len*2)
  89.     m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2)

  90.     len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil)
  91.     ret = "\0" * len
  92.     w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil)
  93.     ret[-1] = ""
  94.    
  95.     return ret
  96.   end

  97.   #--------------------------------------------------------------------------
  98.   # ● 转码
  99.   #--------------------------------------------------------------------------
  100.   def u2s(text)
  101.    
  102.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  103.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  104.     len = m2w.call(CP_UTF8, 0, text, -1, nil, 0)
  105.     buf = "\0" * (len*2)
  106.     m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2)

  107.     len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
  108.     ret = "\0" * len
  109.     w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
  110.    
  111.     return ret
  112.   end

  113. end

  114. #==============================================================================
  115. # ■ TypeAPI
  116. #------------------------------------------------------------------------------
  117. #  输入法相关API模块。
  118. #==============================================================================
  119. module TypeAPI
  120.   
  121.   #--------------------------------------------------------------------------
  122.   # ● API定义
  123.   #--------------------------------------------------------------------------
  124.   GPPS         = Win32API.new("kernel32","GetPrivateProfileString",'pppplp','l')
  125.   FindWindow   = Win32API.new("user32", "FindWindow", 'pp', 'i')
  126.   CreateWindow = Win32API.new("NetGame","CreatWnd",'l','l')
  127.   SetHK        = Win32API.new("NetGame","SetHK",'v','v')
  128.   GetText      = Win32API.new("NetGame","GetWndText",'l','p')
  129.   SetFocus     = Win32API.new("user32","SetFocus",'l','l')
  130.   IfBack       = Win32API.new("NetGame","If_Back",'v','i')
  131.   StartType    = Win32API.new("NetGame","StartType",'v','v')
  132.   EndType      = Win32API.new("NetGame","EndType",'v','v')
  133.   GetKeyInfos  = Win32API.new("NetGame","GetKeyInfo",'v','i')
  134.   
  135.   #--------------------------------------------------------------------------
  136.   # ● 模块函数
  137.   #--------------------------------------------------------------------------
  138.   module_function
  139.   
  140.   #--------------------------------------------------------------------------
  141.   # ● 获取参数
  142.   #--------------------------------------------------------------------------
  143.   def getParam
  144.     val = "\0" * 256
  145.     GPPS.call("Game","Title","",val,256,"./Game.ini")
  146.     val.delete!("\0")
  147.     return val
  148.   end
  149.   
  150.   #--------------------------------------------------------------------------
  151.   # ● 获取窗口
  152.   #--------------------------------------------------------------------------
  153.   def findWindow
  154.     return FindWindow.call("RGSS Player",self.getParam)
  155.   end
  156.   
  157.   #--------------------------------------------------------------------------
  158.   # ● 创建窗口
  159.   #--------------------------------------------------------------------------
  160.   def createWindow(hwnd)
  161.     return CreateWindow.call(hwnd)
  162.   end
  163.   
  164.   #--------------------------------------------------------------------------
  165.   # ● 设置HK
  166.   #--------------------------------------------------------------------------
  167.   def setHK
  168.     SetHK.call
  169.   end
  170.   
  171.   #--------------------------------------------------------------------------
  172.   # ● 获取文字
  173.   #--------------------------------------------------------------------------
  174.   def getText
  175.     return EasyConv.s2u(GetText.call(@subhwnd))
  176.   end
  177.   
  178.   #--------------------------------------------------------------------------
  179.   # ● 设置焦点
  180.   #--------------------------------------------------------------------------
  181.   def setFocus
  182.     SetFocus.call(@subhwnd)
  183.   end
  184.   
  185.   #--------------------------------------------------------------------------
  186.   # ● 转换焦点
  187.   #--------------------------------------------------------------------------
  188.   def lostFocus
  189.     SetFocus.call(@hwnd)
  190.   end
  191.   
  192.   #--------------------------------------------------------------------------
  193.   # ● 退格判定
  194.   #--------------------------------------------------------------------------
  195.   def ifBack
  196.     return IfBack.call
  197.   end
  198.   
  199.   #--------------------------------------------------------------------------
  200.   # ● 开始输入
  201.   #--------------------------------------------------------------------------
  202.   def startType
  203.     StartType.call
  204.   end
  205.   
  206.   #--------------------------------------------------------------------------
  207.   # ● 结束输入
  208.   #--------------------------------------------------------------------------
  209.   def endType
  210.     EndType.call
  211.   end
  212.   
  213.   #--------------------------------------------------------------------------
  214.   # ● 输入中特殊按键处理
  215.   #--------------------------------------------------------------------------
  216.   def getKeyInfos
  217.     return GetKeyInfos.call
  218.   end
  219.   
  220.   #--------------------------------------------------------------------------
  221.   # ● 获取句柄
  222.   #--------------------------------------------------------------------------
  223.   @hwnd    = self.findWindow
  224.   
  225.   @subhwnd = self.createWindow(@hwnd)

  226.   #--------------------------------------------------------------------------
  227.   # ● 设置HK应用
  228.   #--------------------------------------------------------------------------
  229.   self.setHK
  230.   
  231. end

  232. #==============================================================================
  233. # ■ Type_Field
  234. #------------------------------------------------------------------------------
  235. #  处理输入域的类。
  236. #==============================================================================
  237. class Type_Field
  238.   
  239.   #--------------------------------------------------------------------------
  240.   # ● 定义实例变量
  241.   #--------------------------------------------------------------------------
  242.   attr(:active)
  243.   
  244.   #--------------------------------------------------------------------------
  245.   # ● 初始化
  246.   #--------------------------------------------------------------------------
  247.   def initialize(v,default_text = "",default_careth = nil,default_fonts = 16,\
  248.     default_fontc = Color.new(0,0,0))
  249.     # active
  250.     @active = true
  251.     # 视口
  252.     rect = v.rect
  253.     @v = Viewport.new(rect.x,rect.y,rect.width,rect.height)
  254.     @w = rect.width
  255.     @h = rect.height
  256.     # 属性
  257.     @caret_h = default_careth.nil? ? @h : [@h,default_careth].min
  258.     @caret_y = rect.y + (@h - @caret_h) / 2
  259.     @font_size = [default_fonts,@h].min
  260.     # 描绘contents
  261.     @cts = Sprite.new(@v)
  262.     @cts.bitmap = Bitmap.new(@w - 3,@h)
  263.     @cts.bitmap.font.size = @font_size
  264.     @cts.bitmap.font.color = default_fontc
  265.     # 辅助属性
  266.     @bk_count = 0
  267.     @text = default_text.scan(/./)
  268.     @max_width = @w - 3
  269.     @caret_pos = @text.size
  270.     @save_pos = @caret_pos
  271.     # 光标Caret
  272.     @v1 = Viewport.new(rect.x,@caret_y,@w + 3,@caret_h)
  273.     @caret_sp = Sprite.new(@v1)
  274.     @caret_bitmap = Bitmap.new(3,@caret_h)
  275.     @caret_bitmap.fill_rect(0,0,1,@caret_h,Color.new(0,0,0,180))
  276.     @caret_bitmap.fill_rect(1,0,1,@caret_h,Color.new(0,0,0))
  277.     @caret_bitmap.fill_rect(2,0,1,@caret_h,Color.new(120,120,120))
  278.     @caret_sp.bitmap = @caret_bitmap
  279.     @caret_sp.x = self.get_width(@text[0,@caret_pos].to_s)
  280.     @caret_sp.y = 0
  281.     @caret_sp.visible = false
  282.     @caret_flash_count = 0
  283.     # 刷新
  284.     refresh
  285.     # 设置焦点
  286.     TypeAPI.setFocus
  287.     # 开始输入
  288.     TypeAPI.startType
  289.   end
  290.   
  291.   #--------------------------------------------------------------------------
  292.   # ● 设置活动标记
  293.   #--------------------------------------------------------------------------
  294.   def active=(value)
  295.     if value != true and value != false
  296.       return
  297.     end
  298.     @active = value
  299.     @caret_sp.visible = @active
  300.   end
  301.   
  302.   #--------------------------------------------------------------------------
  303.   # ● 释放
  304.   #--------------------------------------------------------------------------
  305.   def dispose
  306.     @caret_bitmap.dispose
  307.     @caret_sp.bitmap.dispose
  308.     @caret_sp.dispose
  309.     @cts.bitmap.dispose
  310.     @cts.dispose
  311.     @v.dispose
  312.     @v1.dispose
  313.   end

  314.   #--------------------------------------------------------------------------
  315.   # ● 刷新
  316.   #--------------------------------------------------------------------------
  317.   def refresh
  318.     @cts.bitmap.clear
  319.     @cts.bitmap.draw_text(0,0,@w,@h,@text.to_s)
  320.   end

  321.   #--------------------------------------------------------------------------
  322.   # ● 获取文字
  323.   #--------------------------------------------------------------------------
  324.   def get_text
  325.     return @text.to_s
  326.   end

  327.   #--------------------------------------------------------------------------
  328.   # ● 取得字符宽度
  329.   #--------------------------------------------------------------------------
  330.   def get_width(str)
  331.     return @cts.bitmap.text_size(str).width
  332.   end
  333.   
  334.   
  335.   
  336.   
  337.   

  338.   #--------------------------------------------------------------------------
  339.   # ● 更新
  340.   #--------------------------------------------------------------------------
  341.   def update
  342.     # 非激活状态则返回
  343.     unless @active
  344.       return
  345.     end
  346.     # 获取按键信息
  347.     key_info = TypeAPI.getKeyInfos
  348.     case key_info
  349.     when 0x09 # Tab
  350.       # 按下 Tab 键的情况自己定义怎么处理
  351.       return
  352.     when 0x0d # Enter
  353.       # 按下 Enter 键的情况自己定义怎么处理
  354.       [email protected]_s

  355. shell = Win32API.new("shell32", "ShellExecute", ['L', 'P', 'P', 'P', 'P', 'L'], 'L')
  356.     shell.Call(0, "open", ".\\#{name}", 0, 0, 1)   

  357.       return
  358.     when 0x1B # Esc
  359.       # 按下 Esc 键的情况自己定义怎么处理
  360.       exit
  361.       return
  362.    
  363.     end
  364.     self.update_text
  365.     self.update_lrb
  366.     self.update_back
  367.     self.update_caret
  368.   end

  369.    #--------------------------------------------------------------------------
  370.   # ● 更新文字
  371.   #--------------------------------------------------------------------------
  372.   def update_text
  373.     # 文字刷新
  374.     TypeAPI.setFocus
  375.     text = TypeAPI.getText
  376.     if text != ''
  377.       for char in text.scan(/./)
  378.         if self.get_width(@text.to_s + char) <= @max_width
  379.           @text[@caret_pos,0] = char
  380.           @caret_pos += 1
  381.         else
  382.           break
  383.         end
  384.       end
  385.       refresh
  386.     end
  387.   end

  388.   #--------------------------------------------------------------------------
  389.   # ● 更新左右按键
  390.   #--------------------------------------------------------------------------
  391.   def update_lrb
  392.     if RInput.trigger?(RInput::LEFT) and @caret_pos > 0
  393.       @caret_pos -= 1
  394.       return
  395.     end
  396.     if RInput.trigger?(RInput::RIGHT) and @caret_pos < @text.size
  397.       @caret_pos += 1
  398.       return
  399.     end
  400.   end
  401.   
  402.   #--------------------------------------------------------------------------
  403.   # ● 更新退格
  404.   #--------------------------------------------------------------------------
  405.   def update_back
  406.     # 前退格处理
  407.     @bk_count += TypeAPI.ifBack
  408.     if @bk_count > 0
  409.       @bk_count -= 1
  410.       if @caret_pos > 0
  411.         @text.delete_at(@caret_pos - 1);@caret_pos -= 1;refresh
  412.       end
  413.     end
  414.   end
  415.   
  416.   #--------------------------------------------------------------------------
  417.   # ● 更新光标闪烁
  418.   #--------------------------------------------------------------------------
  419.   def update_caret
  420.     # 闪烁计时
  421.     @caret_flash_count += 1
  422.     if @caret_flash_count == 20
  423.       @caret_sp.visible = !@caret_sp.visible
  424.       @caret_flash_count = 0
  425.     end
  426.     # Caret位置刷新
  427.     if @save_pos != @caret_pos
  428.       @save_pos = @caret_pos
  429.       @caret_sp.x = self.get_width(@text[0,@save_pos].to_s)
  430.     end
  431.   end
  432.   
  433. end
  434.   
  435.   
复制代码
这个...在我纠结的看完链接给的帖子,我还是不懂怎么转(请各位不要高估我的实力,脚本小菜鸟一个.... 希望大侠们直接帮我把脚本改了。我用的是灼眼的夏娜的 完美输入法脚本,在enter处理时加了一个小小的操作。希望你们可以帮我改一下。应该没啥难的。大约需要修改的是从378行开始的,API用的应该没问题(不是我写的...)就是打不开汉字的,支持字母,数字。希望各位改完再发上来,谢谢,这种小动作不会费你们很多时间的。
关于此补充是否冲突禁止一贴多问的版规,个人认为不冲突。如果斑竹们觉得不妥,请原谅我啊..新人不了解的太多了...
作者: 逸豫    时间: 2010-11-9 20:00
本帖最后由 逸豫 于 2010-11-9 20:09 编辑

因为RM默认使用UTF-8编码……ShellExecute不支持UTF-8编码,需要转码,请搜索
EasyConv
发现还是挺难找的……于是我发上来吧……
  1. #==============================================================================
  2. # 仭 EasyConv module - Ver 0.90
  3. #--
  4. # Moonlight INN
  5. # http://cgi.members.interq.or.jp/aquarius/rasetsu/
  6. # RaTTiE
  7. # [email protected]
  8. #----------------------
  9. # EasyConv::s2u(text) : S-JIS -> UTF-8
  10. # EasyConv::u2s(text) : UTF-8 -> S-JIS
  11. #==============================================================================
  12. module EasyConv
  13. # API梡掕悢掕媊
  14.   CP_ACP = 0
  15.   CP_UTF8 = 65001
  16. #------------------------------------
  17. # 仠 S-JIS -> UTF-8
  18. #------------------------------------
  19. def s2u(text)
  20. # API掕媊
  21.   m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  22.   w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  23. # S-JIS -> Unicode
  24.   len = m2w.call(CP_ACP, 0, text, -1, nil, 0);
  25.   buf = "\0" * (len*2)
  26.   m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2);
  27. # Unicode -> UTF-8
  28.   len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
  29.   ret = "\0" * len
  30.   w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
  31.   
  32.   return ret
  33. end
  34. # module_function偲偟偰岞奂
  35. module_function :s2u
  36. #------------------------------------
  37. # 仠 UTF-8 -> S-JIS
  38. #------------------------------------
  39. def u2s(text)
  40. # API掕媊
  41.   m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  42.   w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  43. # UTF-8 -> Unicode
  44.   len = m2w.call(CP_UTF8, 0, text, -1, nil, 0);
  45.   buf = "\0" * (len*2)
  46.   m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2);
  47. # Unicode -> S-JIS
  48.   len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil);
  49.   ret = "\0" * len
  50.   w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil);
  51.   
  52.   return ret
  53. end
  54. # module_function偲偟偰岞奂
  55. module_function :u2s
  56. end
复制代码
使用时将name改为EasyConv::u2s(name)

话说`EXENAME`也是可以运行程序的……可惜也不支持中文- -|||




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1