Ich habe mir deshalb den beliebten Foxit(Spy)Reader vorgenommen und die Oberfläche automatisiert.
Ohne feiyues Funktion zur FindText() Funktion wäre es kaum gegangen. Mein Skript ist nur ein Gerüst (kein größerer Komfort).
Ein Problem habe ich bei der Aufnahme des Videos festgestellt. Ich arbeite mit 2 Monitoren. Schiebe ich den FoxitReader von Monitor 2 auf Monitor 1 findet die FindText() Funktion die gesuchte linke obere Ecke nicht.
Ansonsten funktionierte mein Skript bei circa 20 PDF Dateien zuverlässig.
Wichtig ist im FoxitReader Tastaturkürzel für die Funktion 'Signatur platzieren' anzulegen (ich habe im Skript und im FoxitReader dafür Strg+Shift+Alt+F9 eingestellt). Alle weiteren Aufrufe nutzen die schon eingestellten Foxit-Kürzel
Wenn man mehrere PDF Dateien nacheinander signieren möchte, muss das Skript in der derzeitigen Variante jeweils neu gestartet werden und im FoxitReader sollte die Einstellung auf mehrere Instanzen eingestellt sein.
Ich habe es leider nicht hinbekommen das TabControl des Foxit Readers zuverlässig auslesen zu können.
Ich hoffe jemand kann das gebrauchen.
Code: Select all
;digital Signieren mit dem FoxitReader
CoordMode, Pixel, Screen
CoordMode, Mouse, Screen
CoordMode, ToolTip, Screen
CoordMode, Menu, Screen
SetTitleMatchMode, 2
ToolTip, Suche aktuelles FoxitReader Fenster!
{ ; Einstellungen für das Fenster 'Dokument signieren'
Ort =
Grund =
SignierenAls =
DokumentNachDerSignierungSperren = 1
Darstellungstyp:=
AutoKennwort = 0 ;nicht implementiert
} ;
{ ; Ermitteln der aktuellen ID des FoxitFenster, ermitteln des Fenstertitel
FoxitID:=WinExist("ahk_class classFoxitReader")
WinGetTitle, FoxitTitle, ahk_id %FoxitID%
FoxitTitle:= Trim(SubStr(FoxitTitle, 1, StrLen(FoxitTitle)-15))
} ;
{ ; Aktivieren des Fenster und Vorbereitung der Signierung
ToolTip, Aktivieren und Vorbereitung der Signierung!
WinMaximize, ahk_id %FoxitID%
WinActivate, ahk_id %FoxitID%
WinWaitActive, ahk_id %FoxitID%,, 4
ControlGet, hPdfFrame, Hwnd,, AfxWnd100su4 , ahk_id %FoxitID% ;das ist der Anzeigebereich der PDF Datei
} ;
{ ; per Tastenkürzel (Achtung müssen im FoxitReader identisch hinterlegt werden) werden ein paar Anzeigeeinstellungen vorgenommen
Tooltip, reduziere auf Full Page View
FoxitReader_ShowFullPage()
sleep, 200
ToolTip, sende Signatur platzieren
FoxitReader_PlaceSignature()
sleep, 200
} ;
{ ; sucht nach der linken oberen Ecke der Pdf Seite der 1.Seite, um dort im Anschluss die Signatur zu erstellen
ToolTip, suche nach der linken oberen Ecke im Dokument.
TopLeft:="|<>*210$71.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzw0000003zzzzs0000007zzzzk000000DzzzzU000000Tzzzz0000000zzzzy0000001zzzzw0000003zzzzs0000007zzzzk000000DzzzzU000000Tzzzz0000000zzzzy0000001zzzzw0000003zzzzs0000007zzzzk000000DzzzzU000000Tzzzz0000000zzzzy0000001"
;sucht hier im Prinzip nach einem Bild (entspricht der linken oberen Ecke des PDF Preview Bereiches) und nicht nach einem Text.
if (ok:=FindText(0, 0, 150000, 150000, 0, 0, TopLeft)) {
CoordMode, Mouse, Screen
X:=ok.1.1, Y:=ok.1.2, W:=ok.1.3, H:=ok.1.4, Comment:=ok.1.5, X+=W//2, Y+=H//2
MouseClickDrag, Left, % x, % y, % x+100, % y+50
}
} ;
{ ; Wartet auf das Signierfenster und ermittelt das Handle und aktiviert das Fenster dann
ToolTip, Warte auf das `"Dokument signieren`" Fenster
WinWait, Dokument signieren ahk_class #32770,, 15
If !ErrorLevel
hDokSig:= WinExist("A")
ToolTip
WinActivate, ahk_id %hDokSig%
WinWaitActive, ahk_id %hDokSig%,, 5
If ErrorLevel
MsgBox, Problem, Scheinbar hat das Platzieren der Signatur nicht funktioniert`nBitte führen Sie das Platzieren manuell durch und drücken im Anschluß auf Ok.
} ;
{ ; Felder im Signierfenster auf die am Anfang des Skriptes festgelegten Werte einstellen
;Signieren als:
ControlFocus, ComboBox1, ahk_id %hDokSig%
Control, ChooseString, %SignierenAls%, ComboBox1, ahk_id %hDokSig%
sleep, 200
;Ort:
ControlFocus, Edit2, ahk_id %hDokSig%
ControlSetText, Edit2,, ahk_id %hDokSig%
ControlSetText, Edit2, %Ort%, ahk_id %hDokSig%
ControlSend, Edit2, {Tab}, ahk_id %hDokSig%
sleep, 200
;Grund:
ControlFocus, Edit3, ahk_id %hDokSig%
ControlSend, Edit3,{Delete}, ahk_id %hDokSig%
ControlSetText, Edit3, %Grund%, ahk_id %hDokSig%
ControlSend, Edit3, {Tab}, ahk_id %hDokSig%
sleep, 200
;Dokument nach der Signierung sperren
If DokumentNachDerSignierungSperren
SureControlCheck("Button4","","", hDokSig)
sleep, 200
;Darstellungstyp:
ControlFocus, ComboBox4, ahk_id %hDokSig%
Control, ChooseString, %Darstellungstyp%, ComboBox4, ahk_id %hDokSig%
sleep, 200
if !spa ;für eventuellen mehrfachen Aufruf des Skriptes
{
InputBox, spa, Kennwort benötigt, Geben Sie Ihr Kennwort für das Signieren ein, HIDE, 300, 140
}
ControlSetText, Edit1, %spa%, ahk_id %hDokSig%
spa:=""
} ;
{ ; Signierfenster schließen und die folgenden Speicherdialage ebenso automatisch abschließen
SureControlClick("Button5","","", hDokSig)
WinWait, Speichern ahk_class #32770 ahk_exe FoxitReader.exe,, 5
While WinExist("Speichern ahk_class #32770") {
SureControlClick("Button1", "Speichern ahk_class #32770","", "")
sleep, 100
If (A_Index>15) {
MsgBox,, Problem, Scheinbar bekomme ich das `"Speichern`" Fenster`n vom FoxitReader bekomme ich nicht geschlossen.`nBitte schließen Sie es manuell und drücken dann auf 'OK'
break
}
}
WinWait, Speichern unter bestätigen ahk_class #32770 ahk_exe FoxitReader.exe,,5
SureControlClick("Button1", "Speichern unter bestätigen ahk_class #32770", "", "")
While WinExist("Speichern unter bestätigen ahk_class #32770") {
SureControlClick("Button1", "Speichern unter bestätigen ahk_class #32770","", "")
sleep, 100
If (A_Index>15) {
MsgBox,, Problem, Scheinbar bekomme ich das `"Speichern unter`" Fenster`n vom FoxitReader bekomme ich nicht geschlossen.`nBitte schließen Sie es manuell und drücken dann auf 'OK'
break
}
}
} ;
{ ; FoxitReader Fenster schließen
WinClose, ahk_id %FoxitID%
} ;
ToolTip, bin durch!
sleep, 4000
ExitApp
{ ; Funktionen
{ ; FoxitReader ShortCuts2Functions
FoxitReader_PlaceSignature() {
Send, {LControl Down}{Shift Down}{Alt Down}{F9}{LControl Up}{Shift Up}{Alt Up} ;%Signatur_platzieren%
}
FoxitReader_OnePageView() {
Send, {LControl Down}{Shift Down}{Alt Down}e{LControl Up}{Shift Up}{Alt Up}
}
FoxitReader_MultiPageView() {
Send, {LControl Down}{Shift Down}{Alt Down}m{LControl Up}{Shift Up}{Alt Up}
}
FoxitReader_ShowFullPage() {
Send, {LControl Down}0{LControl Up}
}
RMApp_NCHITTEST() { ;-- Determines what part of a window the mouse is currently over
/* DESCRIPTON
Function: RMApp_NCHITTEST()
Determines what part of a window the mouse is currently over.
*/
CoordMode, Mouse, Screen
MouseGetPos, x, y, z
SendMessage, 0x84, 0, (x&0xFFFF)|(y&0xFFFF)<<16,, ahk_id %z%
RegExMatch("ERROR TRANSPARENT NOWHERE CLIENT CAPTION SYSMENU SIZE MENU HSCROLL VSCROLL MINBUTTON MAXBUTTON LEFT RIGHT TOP TOPLEFT TOPRIGHT BOTTOM BOTTOMLEFT BOTTOMRIGHT BORDER OBJECT CLOSE HELP", "(?:\w+\s+){" ErrorLevel+2&0xFFFFFFFF "}(?<AREA>\w+\b)", HT)
Return HTAREA
}
} ;
{ ; FindText() von feiyue - Nutze ich um die linke obere Ecke der angezeigten PDF Datei zu finden
/* DESCRIPTION
Note: parameters of the X,Y is the center of the coordinates,
and the W,H is the offset distance to the center,
So the search range is (X-W, Y-H)-->(XW, YH).
err1 is the character "0" fault-tolerant in percentage.
err0 is the character "_" fault-tolerant in percentage.
Text can be a lot of text to find, separated by "|".
ruturn is a array, contains the [X,Y,W,H,Comment] results of Each Find.
*/
FindText(x,y,w,h,err1,err0,text) {
xywh2xywh(x-w,y-h,2*w+1,2*h+1,x,y,w,h)
if (w<1 or h<1)
return, 0
bch:=A_BatchLines
SetBatchLines, -1
;--------------------------------------
GetBitsFromScreen(x,y,w,h,Scan0,Stride,bits)
;--------------------------------------
sx:=0, sy:=0, sw:=w, sh:=h, arr:=[]
Loop, Parse, text, |
{
v:=A_LoopField
IfNotInString, v, $, Continue
Comment:="", e1:=err1, e0:=err0
; You Can Add Comment Text within The <>
if RegExMatch(v,"<([^>]*)>",r)
v:=StrReplace(v,r), Comment:=Trim(r1)
; You can Add two fault-tolerant in the [], separated by commas
if RegExMatch(v,"\[([^\]]*)]",r)
{
v:=StrReplace(v,r), r1.=","
StringSplit, r, r1, `,
e1:=r1, e0:=r2
}
StringSplit, r, v, $
color:=r1, v:=r2
StringSplit, r, v, .
w1:=r1, v:=base64tobit(r2), h1:=StrLen(v)//w1
if (r0<2 or h1<1 or w1>sw or h1>sh or StrLen(v)!=w1*h1)
Continue
;--------------------------------------------
if InStr(color,"-")
{
r:=e1, e1:=e0, e0:=r, v:=StrReplace(v,"1","_")
v:=StrReplace(StrReplace(v,"0","1"),"_","0")
}
mode:=InStr(color,"*") ? 1:0
color:=RegExReplace(color,"[*\-]") . "@"
StringSplit, r, color, @
color:=Round(r1), n:=Round(r2,2)+(!r2)
n:=Floor(255*3*(1-n)), k:=StrLen(v)*4
VarSetCapacity(s1, k, 0), VarSetCapacity(s0, k, 0)
len1:=len0:=0, j:=sw-w1+1, i:=-j
ListLines, Off
Loop, Parse, v
{
i:=Mod(A_Index,w1)=1 ? i+j : i+1
if A_LoopField
NumPut(i, s1, 4*len1++, "int")
else
NumPut(i, s0, 4*len0++, "int")
}
ListLines, On
VarSetCapacity(ss, sw*sh, Asc("0"))
VarSetCapacity(allpos, 1024*4, 0)
;--------------------------------------------
if (num:=PicFind(mode,color,n,Scan0,Stride,sx,sy,sw,sh
,ss,s1,s0,len1,len0,e1,e0,w1,h1,allpos))
or (err1=0 and err0=0
and (num:=PicFind(mode,color,n,Scan0,Stride,sx,sy,sw,sh
,ss,s1,s0,len1,len0,0.05,0.05,w1,h1,allpos)))
{
Loop, % num
pos:=NumGet(allpos, 4*(A_Index-1), "uint")
, rx:=(pos&0xFFFF)+x, ry:=(pos>>16)+y
, arr.Push([rx,ry,w1,h1,Comment])
}
}
SetBatchLines, %bch%
return, arr.MaxIndex() ? arr:0
}
PicFind(mode, color, n, Scan0, Stride, sx, sy, sw, sh, ByRef ss, ByRef s1, ByRef s0, len1, len0, err1, err0, w1, h1, ByRef allpos) {
static MyFunc
if !MyFunc
{
x32:="5589E55383EC408B45200FAF45188B551CC1E20201D0894"
. "5F88B5524B80000000029D0C1E00289C28B451801D08945D0C"
. "745F400000000C745F000000000837D08000F85F00000008B4"
. "50CC1E81025FF0000008945CC8B450CC1E80825FF000000894"
. "5C88B450C25FF0000008945C4C745E800000000E9AC000000C"
. "745EC00000000E98A0000008B45F883C00289C28B451401D00"
. "FB6000FB6C02B45CC8945E48B45F883C00189C28B451401D00"
. "FB6000FB6C02B45C88945E08B55F88B451401D00FB6000FB6C"
. "02B45C48945DC837DE4007903F75DE4837DE0007903F75DE08"
. "37DDC007903F75DDC8B55E48B45E001C28B45DC01D03B45107"
. "F0B8B55F48B452C01D0C600318345EC018345F8048345F4018"
. "B45EC3B45240F8C6AFFFFFF8345E8018B45D00145F88B45E83"
. "B45280F8C48FFFFFFE9A30000008B450C83C00169C0E803000"
. "089450CC745E800000000EB7FC745EC00000000EB648B45F88"
. "3C00289C28B451401D00FB6000FB6C069D02B0100008B45F88"
. "3C00189C18B451401C80FB6000FB6C069C04B0200008D0C028"
. "B55F88B451401D00FB6000FB6C06BC07201C83B450C730B8B5"
. "5F48B452C01D0C600318345EC018345F8048345F4018B45EC3"
. "B45247C948345E8018B45D00145F88B45E83B45280F8C75FFF"
. "FFF8B45242B454883C0018945C08B45282B454C83C0018945B"
. "C8B453839453C0F4D453C8945D0C745E800000000E9FB00000"
. "0C745EC00000000E9DF0000008B45E80FAF452489C28B45EC0"
. "1D08945F88B45408945D88B45448945D4C745F400000000EB7"
. "08B45F43B45387D2E8B45F48D1485000000008B453001D08B1"
. "08B45F801D089C28B452C01D00FB6003C31740A836DD801837"
. "DD800787B8B45F43B453C7D2E8B45F48D1485000000008B453"
. "401D08B108B45F801D089C28B452C01D00FB6003C30740A836"
. "DD401837DD40078488345F4018B45F43B45D07C888B45F08D5"
. "0018955F08D1485000000008B455001D08B4D208B55E801CA8"
. "9D3C1E3108B4D1C8B55EC01CA09DA8910817DF0FF0300007F2"
. "8EB0490EB01908345EC018B45EC3B45C00F8C15FFFFFF8345E"
. "8018B45E83B45BC0F8CF9FEFFFFEB01908B45F083C4405B5DC"
. "24C00909090"
x64:="554889E54883EC40894D10895518448945204C894D288B4"
. "5400FAF45308B5538C1E20201D08945FC8B5548B8000000002"
. "9D0C1E00289C28B453001D08945D4C745F800000000C745F40"
. "0000000837D10000F85000100008B4518C1E81025FF0000008"
. "945D08B4518C1E80825FF0000008945CC8B451825FF0000008"
. "945C8C745EC00000000E9BC000000C745F000000000E99A000"
. "0008B45FC83C0024863D0488B45284801D00FB6000FB6C02B4"
. "5D08945E88B45FC83C0014863D0488B45284801D00FB6000FB"
. "6C02B45CC8945E48B45FC4863D0488B45284801D00FB6000FB"
. "6C02B45C88945E0837DE8007903F75DE8837DE4007903F75DE"
. "4837DE0007903F75DE08B55E88B45E401C28B45E001D03B452"
. "07F108B45F84863D0488B45584801D0C600318345F0018345F"
. "C048345F8018B45F03B45480F8C5AFFFFFF8345EC018B45D40"
. "145FC8B45EC3B45500F8C38FFFFFFE9B60000008B451883C00"
. "169C0E8030000894518C745EC00000000E98F000000C745F00"
. "0000000EB748B45FC83C0024863D0488B45284801D00FB6000"
. "FB6C069D02B0100008B45FC83C0014863C8488B45284801C80"
. "FB6000FB6C069C04B0200008D0C028B45FC4863D0488B45284"
. "801D00FB6000FB6C06BC07201C83B451873108B45F84863D04"
. "88B45584801D0C600318345F0018345FC048345F8018B45F03"
. "B45487C848345EC018B45D40145FC8B45EC3B45500F8C65FFF"
. "FFF8B45482B859000000083C0018945C48B45502B859800000"
. "083C0018945C08B45703945780F4D45788945D4C745EC00000"
. "000E926010000C745F000000000E90A0100008B45EC0FAF454"
. "889C28B45F001D08945FC8B85800000008945DC8B858800000"
. "08945D8C745F800000000E9840000008B45F83B45707D3A8B4"
. "5F84898488D148500000000488B45604801D08B108B45FC01D"
. "04863D0488B45584801D00FB6003C31740E836DDC01837DDC0"
. "00F88910000008B45F83B45787D368B45F84898488D1485000"
. "00000488B45684801D08B108B45FC01D04863D0488B4558480"
. "1D00FB6003C30740A836DD801837DD80078568345F8018B45F"
. "83B45D40F8C70FFFFFF8B45F48D50018955F44898488D14850"
. "0000000488B85A00000004801D08B4D408B55EC01CAC1E2104"
. "189D08B4D388B55F001CA4409C28910817DF4FF0300007F28E"
. "B0490EB01908345F0018B45F03B45C40F8CEAFEFFFF8345EC0"
. "18B45EC3B45C00F8CCEFEFFFFEB01908B45F44883C4405DC39"
. "090909090909090909090909090"
MCode(MyFunc, A_PtrSize=8 ? x64:x32)
}
return, DllCall(&MyFunc, "int",mode, "uint",color, "int",n, "ptr",Scan0, "int",Stride
, "int",sx, "int",sy, "int",sw, "int",sh
, "ptr",&ss, "ptr",&s1, "ptr",&s0, "int",len1, "int",len0
, "int",Round(len1*err1), "int",Round(len0*err0)
, "int",w1, "int",h1, "ptr",&allpos)
}
xywh2xywh(x1,y1,w1,h1,ByRef x,ByRef y,ByRef w,ByRef h) {
SysGet, zx, 76
SysGet, zy, 77
SysGet, zw, 78
SysGet, zh, 79
left:=x1, right:=x1+w1-1, up:=y1, down:=y1+h1-1
left:=left<zx ? zx:left, right:=right>zx+zw-1 ? zx+zw-1:right
up:=up<zy ? zy:up, down:=down>zy+zh-1 ? zy+zh-1:down
x:=left, y:=up, w:=right-left+1, h:=down-up+1
}
GetBitsFromScreen(x,y,w,h,ByRef Scan0,ByRef Stride,ByRef bits) {
VarSetCapacity(bits,w*h*4,0), bpp:=32
Scan0:=&bits, Stride:=((w*bpp+31)//32)*4
Ptr:=A_PtrSize ? "UPtr" : "UInt", PtrP:=Ptr . "*"
win:=DllCall("GetDesktopWindow", Ptr)
hDC:=DllCall("GetWindowDC", Ptr,win, Ptr)
mDC:=DllCall("CreateCompatibleDC", Ptr,hDC, Ptr)
;-------------------------
VarSetCapacity(bi, 40, 0), NumPut(40, bi, 0, "int")
NumPut(w, bi, 4, "int"), NumPut(-h, bi, 8, "int")
NumPut(1, bi, 12, "short"), NumPut(bpp, bi, 14, "short")
;-------------------------
if hBM:=DllCall("CreateDIBSection", Ptr,mDC, Ptr,&bi , "int",0, PtrP,ppvBits, Ptr,0, "int",0, Ptr) {
oBM:=DllCall("SelectObject", Ptr,mDC, Ptr,hBM, Ptr)
DllCall("BitBlt", Ptr,mDC, "int",0, "int",0, "int",w, "int",h, Ptr,hDC, "int",x, "int",y, "uint",0x00CC0020|0x40000000)
DllCall("RtlMoveMemory", Ptr,Scan0, Ptr,ppvBits, Ptr,Stride*h)
DllCall("SelectObject", Ptr,mDC, Ptr,oBM)
DllCall("DeleteObject", Ptr,hBM)
}
DllCall("DeleteDC", Ptr,mDC)
DllCall("ReleaseDC", Ptr,win, Ptr,hDC)
}
MCode(ByRef code, hex) {
ListLines, Off
bch:=A_BatchLines
SetBatchLines, -1
VarSetCapacity(code, StrLen(hex)//2)
Loop, % StrLen(hex)//2
NumPut("0x" . SubStr(hex,2*A_Index-1,2), code, A_Index-1, "char")
Ptr:=A_PtrSize ? "UPtr" : "UInt"
DllCall("VirtualProtect", Ptr,&code, Ptr
,VarSetCapacity(code), "uint",0x40, Ptr . "*",0)
SetBatchLines, %bch%
ListLines, On
}
base64tobit(s) {
ListLines, Off
Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
SetFormat, IntegerFast, d
StringCaseSense, On
Loop, Parse, Chars
{
i:=A_Index-1, v:=(i>>5&1) . (i>>4&1)
. (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
s:=StrReplace(s,A_LoopField,v)
}
StringCaseSense, Off
s:=SubStr(s,1,InStr(s,"1",0,0)-1)
s:=RegExReplace(s,"[^01]+")
ListLines, On
return, s
}
bit2base64(s) {
ListLines, Off
s:=RegExReplace(s,"[^01]+")
s.=SubStr("100000",1,6-Mod(StrLen(s),6))
s:=RegExReplace(s,".{6}","|$0")
Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
SetFormat, IntegerFast, d
Loop, Parse, Chars
{
i:=A_Index-1, v:="|" . (i>>5&1) . (i>>4&1)
. (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
s:=StrReplace(s,v,A_LoopField)
}
ListLines, On
return, s
}
ASCII(s) {
if RegExMatch(s,"(\d+)\.([\w+/]{3,})",r) {
s:=RegExReplace(base64tobit(r2),".{" r1 "}","$0`n")
s:=StrReplace(StrReplace(s,"0","_"),"1","0")
}
else s=
return, s
}
Pic(comments, add_to_Lib=0) {
static Lib:=[]
if (add_to_Lib)
{
re:="<([^>]*)>[^$]+\$\d+\.[\w+/]{3,}"
Loop, Parse, comments, |
if RegExMatch(A_LoopField,re,r)
Lib[Trim(r1)]:=r
}
else
{
text:=""
Loop, Parse, comments, |
text.="|" . Lib[Trim(A_LoopField)]
return, text
}
}
FindTextOCR(nX, nY, nW, nH, err1, err0, Text, Interval=5) {
OCR:="", Right_X:=nX+nW
While (ok:=FindText(nX, nY, nW, nH, err1, err0, Text))
{
; For multi text search, This is the number of text images found
Loop, % ok.MaxIndex()
{
; X is the X coordinates of the upper left corner
; and W is the width of the image have been found
i:=A_Index, x:=ok[i].1, y:=ok[i].2
, w:=ok[i].3, h:=ok[i].4, comment:=ok[i].5
; We need the leftmost X coordinates
if (A_Index=1 or x<Left_X)
Left_X:=x, Left_W:=w, Left_OCR:=comment
}
; If the interval exceeds the set value, add "*" to the result
OCR.=(A_Index>1 and Left_X-Last_X>Interval ? "*":"") . Left_OCR
; Update nX and nW for next search
x:=Left_X+Left_W, nW:=(Right_X-x)//2, nX:=x+nW, Last_X:=x
}
Return, OCR
}
} ;
{ ; andere Funktionen
SureControlClick(CName, WinTitle="", WinText="", WinID="") { ;--Fensteraktivierung + ControlDelay auf -1
SetTitleMatchMode, 2
if (WinID) {
WinTitle:= "ahk_id " . WinID
WinText:=""
}
WinActivate, %WTitle%, %WinText%
WinWaitActive, %WTitle%, %WinText%, 3
SetControlDelay -1
ControlClick, %CName%, %WinTitle%, %WinText%,,, NA ;wenn der Click nicht funktionieren sollte , dann versucht er es ein bißchen anders
If ErrorLevel
ControlClick, %CName%, %WinTitle%, %WinText%
SetControlDelay 20
return ErrorLevel
}
SureControlCheck(CName, WinTitle, WinText="", WinID="") { ;--Fensteraktivierung + ControlDelay auf -1 + Kontrolle ob das Control wirklich checked ist jetzt
if (WINID) {
WinTitle:= "ahk_id " . WinID
WinText:=""
}
BlockInput, On
WinActivate, %WTitle%, %WinText%
WinWaitActive, %WTitle%, %WinText%, 1
Loop {
Control, Check, , %CName%, %WinTitle%, %WinText%
sleep, 40
ControlGet, isornot, checked, , %CName%, %WinTitle%, %WinText%
} until (isornot = 1)
BlockInput, Off
return ErrorLevel
}
} ;
} ;