应该从一个程序(IE)复制到我的电子邮件主题字段的字符串有时会包含错误:
变量主题的消息框(见下文)总是正确的:
subject =%protocol%,%LSN%,%Site%,%Requisition%
但是当代码运行时:
十分之一的字符串未正确放入主题字段:
我希望:
协议C16019,LSN(102707),工地22902,申请102921403
我明白了:
协议c16019(小写字母C而不是大写字母C ),lSN(& 02707°(%而不是1,°代替)),siteé2902( é而不是2 ),请购单& 02921403(&而不是1)
似乎AHK正在使用我的特殊字符(F1-F12键下方的字符行)或者转换按钮被激活。
为什么以及如何解决此问题?
我在某处读到 controlsend 并不总是有效,这是一个已知问题。
旁注:我也在另一个脚本中看到这个,其中@的电子邮件地址并不总是放入发送到字段
我的代码:
Home::
pwb := WBGet()
pTable:= pwb.document.GetElementsByTagName("Table") [4] ;outerHTML ;Set Tag name and Array value
Loop, % pTable.rows.length {
LSN_1:= pTable.rows[9] .GetElementsByTagName("TD") [1].outerHTML ; LSN
protocol_1:= pTable.rows[9] .GetElementsByTagName("TD") [3].outerHTML ; Protocol
Site_1:=pTable.rows[10] .GetElementsByTagName("TD") [1].outerHTML ; Site
Requisition_1:=pTable.rows[12] .GetElementsByTagName("TD") [3].outerHTML ; Requisition
StringTrimLeft, NLSN, LSN_1, 6 ;trims 6 characters from left ( <TD> >)
StringTrimRight, fLSN, NLSN, 5 ;trims 5 characters from right (<TD> )
StringTrimLeft, Nprotocol, protocol_1, 6
StringTrimRight, fprotocol, Nprotocol, 5
StringTrimLeft, Nsite, site_1, 6
StringTrimRight, fsite, Nsite, 5
StringTrimLeft, NRequisition, Requisition_1, 6
StringTrimRight, fRequisition, NRequisition, 5
Requisition= requisition %fRequisition%
sleep,10
LSN= LSN (%fLSN%) ; essential that this variable is put into brackets
sleep,10
Site= site %fsite% ; "site" has to be put before the string
sleep,10
Protocol= protocol %fprotocol% ;"protocol" has to be put before the string
sleep,10
subject= %protocol% , %LSN% , %Site% , %Requisition%
sleep,150
;the variable in Msgbox is always correct here
;send the contents of subject into the subject of outlook
controlFocus, RichEdit20WPT4, ahk_class rctrl_renwnd32
controlSend, RichEdit20WPT4, {end} , ahk_class rctrl_renwnd32 ; send to the end of subject field
controlSendRaw, RichEdit20WPT4, %subject%, ahk_class rctrl_renwnd32
sleep,100
subject :=""
return
}
该字符串在10%-20%的时间内不正确。
请注意,我是一个新手,我已经学习并尝试编写脚本大约2周了。我不明白为什么这个脚本在100%的时间都不起作用。
答案 0 :(得分:1)
您是否有任何理由使用ControlSendRaw而不是ControlSend?我打赌这可能是你的问题。
如果您继续使用ControlSendRaw,则建议您使用BlockInput,开启和阻止输入,关闭周围代码以限制按键干扰。
这是您在上面发布的内容的清理版本:
Home::
pwb := WBGet()
pTable := pwb.document.GetElementsByTagName("Table") [4] ;outerHTML ;Set Tag name and Array value
LSN_1 := pTable.rows[9] .GetElementsByTagName("TD") [1].outerHTML ; LSN
protocol_1:= pTable.rows[9] .GetElementsByTagName("TD") [3].outerHTML ; Protocol
Site_1:=pTable.rows[10] .GetElementsByTagName("TD") [1].outerHTML ; Site
Requisition_1:=pTable.rows[12] .GetElementsByTagName("TD") [3].outerHTML ; Requisition
subject := "protocol " trimVar(protocol_1) " , LSN (" trimVar(LSN_1) ") , Site " trimVar(Site_1) " , Requisition " trimVar(Requisition_1)
;send the contents of subject into the subject of outlook
controlFocus, RichEdit20WPT4, ahk_class rctrl_renwnd32
controlSend, RichEdit20WPT4, {end} , ahk_class rctrl_renwnd32 ; send to the end of subject field
BlockInput, On
controlSendRaw, RichEdit20WPT4, %subject%, ahk_class rctrl_renwnd32
BlockInput, Off
sleep,100
subject :=""
return
trimVar(x) {
StringTrimLeft, x, x, 6 ;trims 6 characters from left ( <TD> >)
StringTrimRight, x, x, 5 ;trims 5 characters from right (<TD> )
Return x
}
我没有看到真正需要一个循环,遗留下代码可能会找到行和列的索引?或者也许有一个目的,很容易编辑它们。希望这可以修复你的随机字符问题。如果没有,尝试使用普通的ControlSend而不是ControlSendRaw,删除BlockInput ......
在我看来,当您使用此脚本插入文本时,您可能会在Outlook中主动键入电子邮件?如果是这种情况,则以下代码使用HotStrings来激活它而不是热键,并且不再需要ControlSend:
#IfWinActive ahk_class rctrl_renwnd32 ;The code below will only work if Outlook is the Active application
::insertlsn:: ;Type HotString to activate code below
pwb := WBGet()
pTable := pwb.document.GetElementsByTagName("Table") [4] ;outerHTML ;Set Tag name and Array value
LSN_1 := pTable.rows[9] .GetElementsByTagName("TD") [1].outerHTML ; LSN
protocol_1:= pTable.rows[9] .GetElementsByTagName("TD") [3].outerHTML ; Protocol
Site_1:=pTable.rows[10] .GetElementsByTagName("TD") [1].outerHTML ; Site
Requisition_1:=pTable.rows[12] .GetElementsByTagName("TD") [3].outerHTML ; Requisition
subject := "protocol " trimVar(protocol_1) " , LSN (" trimVar(LSN_1) ") , Site " trimVar(Site_1) " , Requisition " trimVar(Requisition_1)
SendInput, %subject%
return
trimVar(x) {
StringTrimLeft, x, x, 6 ;trims 6 characters from left ( <TD> >)
StringTrimRight, x, x, 5 ;trims 5 characters from right (<TD> )
Return x
}
最后一个解决方案是使用OutLook COM Objects。您已经使用IE ComObjects,因此您应该对格式有所了解。如果您选择实施此方法,Here是一个很好的参考。