1

应该从一个程序 (IE) 复制到我的电子邮件主题字段的字符串有时包含错误:

然而,变量主题的消息框(见下文)总是正确的:

主题= %protocol% , %LSN% , %Site% , %Requisition%

但是当代码运行时:

十次中有 1 次的字符串未正确放入主题字段中:

我预计:

协议 C16019,LSN (102707),站点 22902,申请 102921403

我得到:

协议 c16019(小写字母 C 代替大写 C),lSN(&02707°(% 代替 1,° 代替)),站点 é2902(é 代替 2),申请 &02921403(& 代替 1)

似乎 AHK 正在使用我的特殊字符(F1-F12 键下方的字符行)或切换按钮被激活。

为什么以及如何解决这个问题?

我在某处读到controlend并不总是有效,这是一个已知问题。

旁注:我在另一个脚本中也看到了这一点,其中电子邮件地址的 @ 并不总是放在发送到字段中

我的代码:

    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% 工作。

4

1 回答 1

1

您有什么理由使用 ControlSendRaw 而不是 ControlSend?我打赌这可能是你的问题。

如果您继续使用ControlSendRaw,建议您使用BlockInput、 On 和 BlockInput, Off 周围的代码来限制按键的干扰。

这是您在上面发布的内容的清理版本:

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而不是 Hotkeys 来激活它,并且不再需要 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 对象。您已经使用过 IE ComObjects,因此您应该对这种格式有些熟悉。如果您选择实现此方法,这是一个很好的参考。

于 2015-06-10T20:21:54.540 回答