Project1

标题: 免DLL的输入法`` [打印本页]

作者: 神思    时间: 2008-7-10 03:47
标题: 免DLL的输入法``
大概就酱紫...

圆一下以前的想法..哈....

参考于.
http://rpg.blue/viewthread.php?t ... D7%2D9+19%3A46%3A04

  1. #------------------------------------------------------------------------------
  2. # Moonlight INN
  3. # [url]http://cgi.members.interq.or.jp/aquarius/rasetsu/[/url]
  4. # RaTTiE
  5. # [email][email protected][/email]
  6. #------------------------------------------------------------
  7. # EasyConv::s2u(text) : S-JIS -> UTF-8
  8. # EasyConv::u2s(text) : UTF-8 -> S-JIS
  9. #==============================================
  10. module EasyConv
  11. # API梡掕悢掕媊
  12.    CP_ACP = 0
  13.    CP_UTF8 = 65001

  14. #--------------------------------------------------------------------------
  15. # 仠 S-JIS -> UTF-8
  16. #--------------------------------------------------------------------------
  17. def s2u(text)
  18. # API掕媊
  19.    m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  20.    w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  21. # S-JIS -> Unicode
  22.    len = m2w.call(CP_ACP, 0, text, -1, nil, 0);
  23.    buf = "\0" * (len*2)
  24.    m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2);

  25. # Unicode -> UTF-8
  26.    len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
  27.    ret = "\0" * len
  28.    w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
  29.    
  30.    return ret
  31. end
  32. # module_function偲偟偰岞奐
  33. module_function :s2u
  34. #--------------------------------------------------------------------------
  35. # 仠 UTF-8 -> S-JIS
  36. #--------------------------------------------------------------------------
  37. def u2s(text)
  38. # API掕媊
  39.    m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  40.    w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  41. # UTF-8 -> Unicode
  42.    len = m2w.call(CP_UTF8, 0, text, -1, nil, 0);
  43.    buf = "\0" * (len*2)
  44.    m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2);

  45. # Unicode -> S-JIS
  46.    len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil);
  47.    ret = "\0" * len
  48.    w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil);
  49.    
  50.    return ret
  51. end
  52. # module_function偲偟偰岞奐
  53. module_function :u2s
  54. end

  55. #========================================
  56. # 本脚本来自[url]www.66rpg.com[/url]
  57. #========================================





  58. #==============================================================================
  59. # ■ TextBox
  60. #------------------------------------------------------------------------------
  61. #  设置输入窗口
  62. #==============================================================================
  63. class TextBox
  64. # 获取程序模块
  65. GetModuleHandle = Win32API.new("kernel32", "GetModuleHandle", "p", "l")
  66. # 创建窗口
  67. CreateWindowEx = Win32API.new("user32", "CreateWindowExA", "lppllllllllp", "l")
  68. # 销毁窗口
  69. DestroyWindow = Win32API.new("user32", "DestroyWindow", "l", "l")
  70. # 控制窗口显示
  71. ShowWindow = Win32API.new("user32", "ShowWindow", "ll", "l")
  72. # 设置输入焦点
  73. SetFocus = Win32API.new("user32", "SetFocus", "l", "l")
  74. # 获取活动的窗口
  75. GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, "l")
  76. # 获取控件文字
  77. GetWindowText = Win32API.new("user32", "GetWindowTextA", "lpl", "l")
  78. # 获取控件文字长度
  79. GetWindowTextLength = Win32API.new("user32", "GetWindowTextLength", "l", "l")
  80. # 设置控件文字
  81. SetWindowTextA = Win32API.new("user32", "SetWindowTextA", "lp", "l")
  82. # 刷新窗口
  83. UpdateWindow = Win32API.new("user32", "UpdateWindow", "l", "l")
  84. # 常数
  85. WS_CHILD = 0x40000000
  86. #--------------------------------------------------------------------------
  87. # ● 初始化
  88. #--------------------------------------------------------------------------
  89. def initialize(w, h)
  90.     @wnd = CreateWindowEx.call(1, "Edit", "", WS_CHILD, 0,0,w,h,GetActiveWindow.call,1,GetModuleHandle.call(nil),1)
  91.     SetFocus.call(@wnd)
  92.     ShowWindow.call(@wnd,0)
  93. end
  94. #--------------------------------------------------------------------------
  95. # ● 释放窗口
  96. #--------------------------------------------------------------------------
  97. def dispose
  98.     DestroyWindow.call(@wnd)
  99. end
  100. #--------------------------------------------------------------------------
  101. # ● 获取txt
  102. #--------------------------------------------------------------------------
  103. def txt
  104.     length = GetWindowTextLength.call(@wnd)
  105.     lpstring = Array.new(length+1).pack("C*")
  106.     GetWindowText.call(@wnd, lpstring, length)
  107.     lpstring.delete!("\0")
  108.     t = EasyConv::s2u(lpstring)
  109.     return t
  110. end
  111. #--------------------------------------------------------------------------
  112. # ● 设置txt
  113. #--------------------------------------------------------------------------
  114. def set_txt(txt)
  115.     str = EasyConv::u2s(txt)
  116.     SetWindowTextA.call(@wnd, str)
  117. end
  118. #--------------------------------------------------------------------------
  119. # ● 刷新
  120. #--------------------------------------------------------------------------
  121. def update
  122.     UpdateWindow.call(@wnd)
  123.     SetFocus.call(@wnd)
  124. end
  125. end

  126. t = TextBox.new(320, 24)
  127. v = Viewport.new(160, 228, 320 , 24)
  128. sprite = Sprite.new(v)
  129. sprite.bitmap = Bitmap.new(320,24)
  130. sprite.bitmap.fill_rect(0,0,320,24,Color.new(0,0,0))
  131. sprite.bitmap.fill_rect(1,1,318,22,Color.new(255,255,255))
  132. cou = Sprite.new(v)
  133. cou.bitmap = Bitmap.new(1, 22)
  134. cou.bitmap.fill_rect(0, 0, 1, 22, Color.new(0,255,255))
  135. cou.y = 1
  136. s = t.txt
  137. loop {
  138. Graphics.update
  139. Input.update
  140. t.update
  141. cou.visible = Time.now.sec % 2 == 0
  142. if s != t.txt
  143. cou.visible = true
  144. s = t.txt
  145. sprite.bitmap.clear
  146. sprite.bitmap.font.size = 18
  147. sprite.bitmap.font.color.set(0,0,0)
  148. sprite.bitmap.fill_rect(0,0,320,24,Color.new(0,0,0))
  149. sprite.bitmap.fill_rect(1,1,318,22,Color.new(255,255,255))
  150. sprite.bitmap.draw_text(0,0,320,24,s)
  151. cou.x = 1 + sprite.bitmap.text_size(s).width
  152. end
  153. }

复制代码

作者: ★_茄孓    时间: 2008-7-10 03:52
哇.这输入法不错啊,大力支持{/qiang}
不过我发现了个问题
就是打字的时候,
我打完一个 “我” 字
没有显示出来
然后等我在随便打一个字后 比如说我打了 “是”
但是显示的是“我”,我在随便打一个字
才显示 “是“跟不上顺序
作者: yangff    时间: 2008-7-10 04:27
以下引用越前リョーマ于2008-7-9 20:09:00的发言:

话说比起以往的有什么优点吗?

请不要问如此无聊的问题 {/gg}
作者: yangff    时间: 2008-7-10 04:32

CreateWindowEx 阿
和我想的一样,但是不知道为什么我总是无法生成窗口
作者: 越前リョーマ    时间: 2008-7-10 05:39
以下引用yangff于2008-7-9 20:27:31的发言:


以下引用越前リョーマ于2008-7-9 20:09:00的发言:

话说比起以往的有什么优点吗?


请不要问如此无聊的问题  

如果一点优点都没有的话为什么要写呢……
节省体积?
作者: yangff    时间: 2008-7-10 06:00
以下引用越前リョーマ于2008-7-9 21:39:28的发言:


以下引用yangff于2008-7-9 20:27:31的发言:


以下引用越前リョーマ于2008-7-9 20:09:00的发言:

话说比起以往的有什么优点吗?


请不要问如此无聊的问题  


如果一点优点都没有的话为什么要写呢……
节省体积?

俄。。。
风吗你不相及/。
节省体积?
搞笑。。。
lz的思路就像你往6r的回复框里输入东西 {/wx}
作者: v2sam    时间: 2008-7-10 06:12
没啥~很支持~~就是LZ的头像吓到我了~
作者: link006007    时间: 2008-7-10 06:59
话说哪里免dll了... ...
作者: yangff    时间: 2008-7-10 23:01
以下引用link006007于2008-7-9 22:59:51的发言:

话说哪里免dll了... ...

实话。。。。
作者: 神思    时间: 2008-7-11 01:02
-______,-|||
咳...不过`那几个DLL...有谁没有的么``...?
作者: 神思    时间: 2008-7-11 01:18
以下引用越前リョーマ于2008-7-9 21:39:28的发言:


以下引用yangff于2008-7-9 20:27:31的发言:


以下引用越前リョーマ于2008-7-9 20:09:00的发言:

话说比起以往的有什么优点吗?


请不要问如此无聊的问题  


如果一点优点都没有的话为什么要写呢……
节省体积?

这...这我就奇怪了``
是不是有谁做过什么事情后其他人就不能做了呢`??
再说了``我又出去看了看..的确是'脚本交流'吧..我这个并不是发布帖啊....我只是想试试..借助默认的API函数一样可以做到输入法的效果而已```我做错什么了吗``??`
作者: 越前止まる殇    时间: 2008-7-11 03:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: q2571875    时间: 2008-7-11 04:03
背景,黑的。。。
作者: 大地的雨    时间: 2008-7-11 06:51
看到大人……膜拜……
作者: 七夕小雨    时间: 2008-7-11 07:03
-o-原来是神思啊…………

…………士别三日自当刮目相看
作者: 大地的雨    时间: 2008-7-11 07:06
以下引用七夕小雨于2008-7-10 23:03:21的发言:
-o-原来是神思啊…………

…………士别三日自当刮目相看

看到小雨大哥……膜拜……
作者: 小传子    时间: 2008-7-13 01:12
以下引用七夕小雨于2008-7-10 23:03:21的发言:

-o-原来是神思啊…………

…………士别三日自当刮目相看

{/hx}刮刮乐啊,不知道刮了多少次了
作者: orochi2k    时间: 2008-7-13 02:07
"刮目相看"其实是眼保贱操 第四节的内容....

另:那个转码的东东其实用处很大{/cy}
作者: 南宫恋絮    时间: 2008-7-13 02:39
-v-其实我只想来打个招呼
那日在思思的空间看到这个脚本= =
作者: 轮回者    时间: 2008-7-14 03:37
赞!
作者: 36763183    时间: 2008-7-14 20:23
虽然不怎么懂,还是进来支持一个~
作者: 36763183    时间: 2008-7-14 20:29
请问神思可以把这个输入法和人物取名整合一下吗?这样就有用武之地了。
作者: orochi2k    时间: 2008-7-15 07:18
以下引用Morin2008于2008-7-14 7:40:33的发言:

我第一眼看这个脚本就发现有一些不太适合中国人使用的地方:
我们中国大陆人用的简体中文是GB2312编码的,而脚本里面的编码转换定义母码却是Shift-JIS(日文编码)[脚本里明文写着呢]。
神思最好自己改改看,否则估计会出现一些譬如乱码等问题。


[本贴由作者于 2008-7-14 7:41:07 最后编辑]


重点是UNICODE 转到 UTF8....
{/lh}
呃...其实石器时代的输入法也用了这个转码
作者: 轮回者    时间: 2008-7-15 18:33
UTF16霸道!!!
作者: lqn619    时间: 2008-7-25 22:07
怎样才能使输入的东西变成角色名字啊???
作者: 幻獬豸    时间: 2008-8-4 23:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: CIS狂人    时间: 2008-8-6 05:00
...现在就在用LZ的ARPG系统,还做出了伪·同伴系统和彩虹神剑超动画显示版(简称彩超……)
作者: danny8376    时间: 2009-6-3 02:20
以下引用★_茄孓于2008-7-9 19:52:09的发言:

哇.这输入法不错啊,大力支持
不过我发现了个问题
就是打字的时候,
我打完一个 “我” 字
没有显示出来
然后等我在随便打一个字后 比如说我打了 “是”
但是显示的是“我”,我在随便打一个字
才显示 “是“跟不上顺序

把TextBox中的txt方法用下面的取代就解決了
  1. #--------------------------------------------------------------------------
  2. # ● 获取txt
  3. #--------------------------------------------------------------------------
  4. def txt
  5.     length = GetWindowTextLength.call(@wnd) + 1
  6.     lpstring = "\000" * length
  7.     GetWindowText.call(@wnd, lpstring, length)
  8. #    lpstring.delete!("\000")
  9.     t = EasyConv::s2u(lpstring)
  10.     return t.delete!("\000")
  11. end
复制代码

作者: 越前リョーマ    时间: 2009-6-12 08:00
话说比起以往的有什么优点吗?




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