sxh_why 发表于 2010-2-9 14:04:00

[请教]sendkeys不能发中文字符,及粘贴板的应用-请高手帮忙修改一下源程序

本帖最后由 作者 于 2010-2-25 21:47:14 编辑 <br /><br /> <p>我想用sendkeys对一些有用的cad命令进行三次开发,比如用sendkeys自动填写对话框,但是发现sendkeys不能发中文字符,(要发送的变量里,不能有中文字符串)。这个问题请教高手如何处理。</p><p>我的设想是利用粘贴板来发送,那位有范例,发个给我学习一下。</p><p>2010-2-25日,以下程序请高手帮忙修改一下;</p><p>功能介绍:选四个text,Z1~Z4,然后用sendkeys发送到弹出的对话框里,其中Z2和Z3是中文,要用粘贴板Ctrl+v发送,但是</p><p>我发第二个中文字符串Z3的时候,不会写了。</p><p>备注:程序里的Title命令是intecad的填写标题栏命令</p><p>;上海港巨机械设计事务所 <br/>;<br/>;;;=================================================================*<br/>;;;&nbsp; 读写系统剪贴板&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br/>;;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br/>;;;=================================================================*<br/>;;;功能:读取系统剪贴板中字符串<br/>(defun GET-CLIP-STRING (/ HTML RESULT)<br/>&nbsp;&nbsp;&nbsp; (and (setq HTML (vlax-create-object "htmlfile"))<br/>&nbsp; (setq RESULT (vlax-invoke<br/>&nbsp;&nbsp;&nbsp;&nbsp; (vlax-get (vlax-get HTML 'PARENTWINDOW)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'CLIPBOARDDATA<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; 'GETDATA<br/>&nbsp;&nbsp;&nbsp;&nbsp; "Text"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (vlax-release-object HTML)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; RESULT<br/>)<br/>;;;=================================================================*<br/>;;;功能:向系统剪贴板写入文字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br/>(defun SET-CLIP-STRING (STR / HTML RESULT)<br/>&nbsp;&nbsp;&nbsp; (and (= (type STR) 'STR)<br/>&nbsp; (setq HTML (vlax-create-object "htmlfile"))<br/>&nbsp; (setq RESULT (vlax-invoke<br/>&nbsp;&nbsp;&nbsp;&nbsp; (vlax-get (vlax-get HTML 'PARENTWINDOW)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'CLIPBOARDDATA<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; 'SETDATA<br/>&nbsp;&nbsp;&nbsp;&nbsp; "Text"<br/>&nbsp;&nbsp;&nbsp;&nbsp; STR<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (vlax-release-object HTML)<br/>&nbsp;&nbsp;&nbsp; )<br/>)<br/>;;;=================================================================*</p><p>;;;=================================================================*<br/>(defun CL-CLIP ( / HTML RESULT)<br/>&nbsp;&nbsp;&nbsp; (and (setq HTML (vlax-create-object "htmlfile"))<br/>&nbsp; (setq RESULT (vlax-invoke<br/>&nbsp;&nbsp;&nbsp;&nbsp; (vlax-get (vlax-get HTML 'PARENTWINDOW)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'CLIPBOARDDATA<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; 'CLEARDATA<br/>&nbsp;&nbsp;&nbsp;&nbsp; "Text"<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (vlax-release-object HTML)<br/>&nbsp;&nbsp;&nbsp; )<br/>)</p><p>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</p><p>(DEFUN C:33()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PRINT "自动填写标题栏")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ S (SSGET ))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ N (SSLENGTH S))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ S1 (SSNAME S 0))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ S1V (ENTGET S1))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ Z1 (CDR (ASSOC 1 S1V)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PRINT Z1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ S2 (SSNAME S 1))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ S2V (ENTGET S2))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ Z2 (CDR (ASSOC 1 S2V)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PRINT Z2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ S3 (SSNAME S 2))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ S3V (ENTGET S3))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ Z3 (CDR (ASSOC 1 S3V)))<br/>&nbsp; (PRINT Z3)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ S4 (SSNAME S 3))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ S4V (ENTGET S4))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SETQ Z4 (CDR (ASSOC 1 S4V)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PRINT Z4)<br/>(Vlax-Invoke-Method (Vlax-Get (Vlax-Get-Acad-Object) 'ActiveDocument) 'SendCommand (car (list "TITLE "<br/>(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "{DEL 20}")<br/>(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys Z1)<br/>(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "{Enter}{DEL 20}")<br/>(SET-CLIP-STRING z2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "^v")<br/>(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "{Enter}{DEL 20}")<br/>(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys Z3)<br/>(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "{Enter}{DEL 20}")<br/>(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys Z4)<br/>(Vlax-Invoke-Method (Vlax-Get-Or-Create-Object "WScript.Shell" ) 'Sendkeys "%Y")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )))</p><p><br/>&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</p>

sxh_why 发表于 2010-2-11 22:45:00

<p>用zml大哥的读写剪贴板函数,搞定了一部分程序,勉强能用了。</p><p>碰到一个小问题,剪贴板只能用一次,因此只能发一次中文。不知道错在哪里。</p>

sxh_why 发表于 2010-2-15 14:08:00

本帖最后由 作者 于 2010-2-19 18:59:37 编辑 <br /><br /> <p>最后一步了,哪位大侠支援一下:</p><p>对剪贴板第二次赋值时反应:OpenClipboard 失败,</p><p>我猜想是需要先关闭剪贴板,才能进行第二次赋值。</p><p>请教以下这句在lisp里这么写:</p><p>(CloseClipboard)</p><p></p><p></p><p></p><p>;试了很多方法,还是失败。感觉lisp只能用一次剪贴板。</p><p>顺便给ay老师做个广告,在他的ys168上找到不少函数库,非常不错。</p><p>梁雄啸大侠的网站也不可错过:<a href="http://dreamskylxx.woku.com/index.php">http://dreamskylxx.woku.com/index.php</a></p>

sxh_why 发表于 2010-2-25 20:57:00

详细见1楼

sxh_why 发表于 2010-9-11 08:58:00

<p>为什么只能发一次中文,有人搞定它吗?</p>
<p>&nbsp;</p>

sxh_why 发表于 2011-7-4 13:00:26

很长时间过去了,我还是没搞定sendkey发送中文的问题。
高手们给力一点哈。
如果看到DEL 20 觉得危险,删掉就是了,我是用来清除原有内容的。

caoyin 发表于 2011-7-4 14:24:56

呵呵,三次开发!好像意义不大啊,下载AutoIt软件试试看,它是这方面的专业工具

sxh_why 发表于 2011-7-5 12:43:52

高手给力呀!!!!!!!!!!!
我的工作软件是天喻cad软件。没办法抛开天喻软件。天喻软件的后台程序根本不了解。所以只能考虑sendkey

sxh_why 发表于 2011-7-5 16:07:50

谢谢版主。
看了一下AutoIt的简介,就被深深吸引了。
下载教程和软件中。。。

highflybir 发表于 2011-7-5 16:28:48

可以利用form2.0来设置粘贴板
修改了一下你的程序,
下面的程序可以多次设置粘贴板,

;;;利用form2.0设置和获取剪贴板
(defun GetTextBox (/ fmo ctr box)
(setq fmo (vlax-create-object "Forms.form.1"));Form
(setq ctr (vlax-GET fmo 'Controls))   ;控件
(setq box (vlax-invoke ctr 'add"Forms.textbox.1"));文本框
(vlax-put box 'MultiLine :vlax-true)
(list box ctr fmo)
)
;;获取剪贴版数据
(defun GetClip (box)
(if (= (vlax-get box 'CanPaste ) :vlax-true)   ;如能粘贴
    (progn
      (vlax-invoke box 'Paste )    ;粘贴进去
      (vlax-get box 'text)    ;显示文本
    )
)
)
;;设置剪贴版数据
(defun SetClip (Box str)
(vlax-put box 'text str)    ;设置剪贴板文本内容
(vlax-put box 'SelStart 0)
(vlax-put box 'SelLength (vlax-get box 'textlength))
(vlax-invoke box 'copy)    ;拷贝进去
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(DEFUN C:33 ()
(PRINT "自动填写标题栏")
(SETQ S (SSGET))
(SETQ N (SSLENGTH S))
(SETQ S1 (SSNAME S 0))
(SETQ S1V (ENTGET S1))
(SETQ Z1 (CDR (ASSOC 1 S1V)))
(PRINT Z1)
(SETQ S2 (SSNAME S 1))
(SETQ S2V (ENTGET S2))
(SETQ Z2 (CDR (ASSOC 1 S2V)))
(PRINT Z2)
(SETQ S3 (SSNAME S 2))
(SETQ S3V (ENTGET S3))
(SETQ Z3 (CDR (ASSOC 1 S3V)))
(PRINT Z3)
(SETQ S4 (SSNAME S 3))
(SETQ S4V (ENTGET S4))
(SETQ Z4 (CDR (ASSOC 1 S4V)))
(PRINT Z4)
;;;以下作了修改
(setq wsh (vlax-get-or-create-object "WScript.Shell"))
(setq lst (GetTextBox))
(setq box (car lst))
(Vlax-Invoke
    (Vlax-Get (Vlax-Get-Acad-Object) 'ActiveDocument)
    'SendCommand
    (car (list "TITLE "
      (Vlax-Invoke wsh 'Sendkeys "{DEL 20}")
      (SetClip box z1)
      (Vlax-Invoke wsh 'Sendkeys "^v")
      
      (Vlax-Invoke wsh 'Sendkeys "{Enter}{DEL 20}")
      (SetClip box z2)   ;;(SET-CLIP-STRING z2)
      (Vlax-Invoke wsh 'Sendkeys "^v")
      
      (Vlax-Invoke wsh 'Sendkeys "{Enter}{DEL 20}")
      (SetClip box z3)
      (Vlax-Invoke wsh 'Sendkeys "^v")
      
      (Vlax-Invoke wsh 'Sendkeys "{Enter}{DEL 20}")
      (SetClip box z4)
      (Vlax-Invoke wsh 'Sendkeys "^v")
      
      (Vlax-Invoke wsh 'Sendkeys "%Y")
)
    )
)
(vlax-release-object wsh)
(mapcar 'vlax-release-object lst)
)

页: [1] 2
查看完整版本: [请教]sendkeys不能发中文字符,及粘贴板的应用-请高手帮忙修改一下源程序