[请教]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/>;;; 读写系统剪贴板 *<br/>;;; *<br/>;;;=================================================================*<br/>;;;功能:读取系统剪贴板中字符串<br/>(defun GET-CLIP-STRING (/ HTML RESULT)<br/> (and (setq HTML (vlax-create-object "htmlfile"))<br/> (setq RESULT (vlax-invoke<br/> (vlax-get (vlax-get HTML 'PARENTWINDOW)<br/> 'CLIPBOARDDATA<br/> )<br/> 'GETDATA<br/> "Text"<br/> )<br/> )<br/> (vlax-release-object HTML)<br/> )<br/> RESULT<br/>)<br/>;;;=================================================================*<br/>;;;功能:向系统剪贴板写入文字 *<br/>(defun SET-CLIP-STRING (STR / HTML RESULT)<br/> (and (= (type STR) 'STR)<br/> (setq HTML (vlax-create-object "htmlfile"))<br/> (setq RESULT (vlax-invoke<br/> (vlax-get (vlax-get HTML 'PARENTWINDOW)<br/> 'CLIPBOARDDATA<br/> )<br/> 'SETDATA<br/> "Text"<br/> STR<br/> )<br/> )<br/> (vlax-release-object HTML)<br/> )<br/>)<br/>;;;=================================================================*</p><p>;;;=================================================================*<br/>(defun CL-CLIP ( / HTML RESULT)<br/> (and (setq HTML (vlax-create-object "htmlfile"))<br/> (setq RESULT (vlax-invoke<br/> (vlax-get (vlax-get HTML 'PARENTWINDOW)<br/> 'CLIPBOARDDATA<br/> )<br/> 'CLEARDATA<br/> "Text"<br/> <br/> )<br/> )<br/> (vlax-release-object HTML)<br/> )<br/>)</p><p>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</p><p>(DEFUN C:33()<br/> (PRINT "自动填写标题栏")<br/> (SETQ S (SSGET ))<br/> (SETQ N (SSLENGTH S))<br/> (SETQ S1 (SSNAME S 0))<br/> (SETQ S1V (ENTGET S1))<br/> (SETQ Z1 (CDR (ASSOC 1 S1V)))<br/> (PRINT Z1)<br/> (SETQ S2 (SSNAME S 1))<br/> (SETQ S2V (ENTGET S2))<br/> (SETQ Z2 (CDR (ASSOC 1 S2V)))<br/> (PRINT Z2)<br/> (SETQ S3 (SSNAME S 2))<br/> (SETQ S3V (ENTGET S3))<br/> (SETQ Z3 (CDR (ASSOC 1 S3V)))<br/> (PRINT Z3)<br/> (SETQ S4 (SSNAME S 3))<br/> (SETQ S4V (ENTGET S4))<br/> (SETQ Z4 (CDR (ASSOC 1 S4V)))<br/> (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) <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") )))</p><p><br/> <br/> )</p> <p>用zml大哥的读写剪贴板函数,搞定了一部分程序,勉强能用了。</p><p>碰到一个小问题,剪贴板只能用一次,因此只能发一次中文。不知道错在哪里。</p> 本帖最后由 作者 于 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> 详细见1楼 <p>为什么只能发一次中文,有人搞定它吗?</p><p> </p> 很长时间过去了,我还是没搞定sendkey发送中文的问题。
高手们给力一点哈。
如果看到DEL 20 觉得危险,删掉就是了,我是用来清除原有内容的。 呵呵,三次开发!好像意义不大啊,下载AutoIt软件试试看,它是这方面的专业工具 高手给力呀!!!!!!!!!!!
我的工作软件是天喻cad软件。没办法抛开天喻软件。天喻软件的后台程序根本不了解。所以只能考虑sendkey 谢谢版主。
看了一下AutoIt的简介,就被深深吸引了。
下载教程和软件中。。。 可以利用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