AHK v2

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

AHK v2

11 Mar 2016, 03:02

Hallo zusammen,

ich hab da ein paar Fragen zu AHK v2.

1. Gibt es funktionen wie Type() auch für v1.1? Wenn ja, wo finde ich diese?
2. Kann man AHK v2 per DLL aus v1.1 heraus starten? Wenn ja, wie?

Die Sache ist die, starte ich v2 hier auf der Arbeit will es Adminrechte. Das schöne an v1.1 ist, dass diese nicht gebraucht werden.
Folglich kann ich hier mit v2 nicht arbeiten.

Das einzige Script welches aktuell mit dem Google Translator klar kommt ist aber nun leider eines das auf v2 setzt.
Also kann ich nun entweder versuchen, das Script auf v1.1 umzuschreiben - stellt sich aber als nicht so einfach heraus :)
Oder vllt. klappt es ja per DLL. Ich weiß nur leider gar nicht wie man ein Script per DLL aufruft.

Es geht um https://autohotkey.com/boards/viewtopic ... ac1#p75379

Vielleicht mag mir ja jemand auf die sprünge helfen :)

Vielen Dank!

MfG
fump
HotKeyIt
Posts: 1870
Joined: 29 Sep 2013, 18:35
Contact:

Re: AHK v2

11 Mar 2016, 04:26

Lade AutoHotkey.dll runter und speichere es zusammen mit translate_google.ahk und folgendem Script in einem Ordner.

Code: Select all

DllCall("LoadLibrary","Str",ahkdll:=A_ScriptDir "\AutoHotkey.dll")
DllCall(ahkdll "\ahkdll","Str",A_ScriptDir "\translate_google.ahk","Str","")
While DllCall(ahkdll "\ahkReady")
  Sleep 100
ExitApp
Type für v1 findest du hier.
just me
Posts: 6486
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: AHK v2

11 Mar 2016, 04:30

Moin,

ich habe AHK_H jetzt schon länger nicht mehr getestet, habe aber zur Ausführung noch nie Adminrechte gebraucht, und kann mir auch nicht so recht vorstellen, dass HotkeyIt das geändert hat. Wenn es Dir überhaupt möglich ist, auf Deinem Jobcomputer eine neue Exe-Datei abzulegen, brauchst Du nicht mehr als die zu AHK_H gehörige AutoHotkey.exe. Du könntest dann z.B. mit AHKRCMS im ahk-Contextmenü ein zusätzliches Run-Kommando einbauen, das die Skripte mit AHK_H startet, oder Dir eine lnk-Datei dafür erstellen.

Edit: Oder Du machst, es so, wie gerade eben von HotKeyIt beschrieben. ;)

P.S.: Im Skript sehe ich nichts, was nicht auch in AHK 1.1 zu realisieren wäre. Das wird dann nur etwas umständlicher.
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: AHK v2

11 Mar 2016, 04:43

Ich hab mir v2 ganz normal runtergeladen. Habe es entpackt und die Exe gestartet. Windows 10 fragt dann nach Adminzugang. Das passiert mit 1.1 nicht.
Ich kann hier sogar neue exe Dateien compilieren und verwenden mit 1.1
Schon merkwürdig wenn du sagst das Adminrechte nicht nötig seien dass Win10 doch danach fragt? Warum?
HotKeyIt
Posts: 1870
Joined: 29 Sep 2013, 18:35
Contact:

Re: AHK v2

11 Mar 2016, 04:50

Ich habe es bei mir (Windows10) noch mal mit standart Konto ohne Administratorrechte getestet und es verlangt nicht nach Administrator Passwort!
Du kannst bei Datei Eigenschaften -> Comatibilität gucken ob Programm als Administrator ausführen ausgewählt wurde.
Eventuell ist die Datei gesperrt und muss entsperrt werden: http://blogs.myfirstsharepoint.de/wp-co ... mage28.png
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: AHK v2

11 Mar 2016, 05:01

In Zeile 143 vom google Script steht return ToInt(a)
Ist ToInt eine funktion? Es gibt sie nicht im Script und ich finde auch keine.

Dann noch eine Sache.
In Zeile 107 bemängelt 1.1 ein fehlendes " aber eigentlich fehlt da keins oder ich übersehe es...

Code: Select all

while (p:=InStr(s,"`"",,i+1)) and (SubStr(s,p-1,1)=JSONS)
EDIT:
Nun kann ich v2 auch starten.
Da es eine ZIP ist bin ich per Explorer ins Archiv und habe aus dem Ordner die EXE heraus in einen anderen kopiert. Dann verlangt Win10 Adminrechte wg. der von dir genannten Gründe.
Entpacke ich das Zip mit 7Zip kann ich die EXE normal verwenden.

Dennoch würde ich das Script gerne mit 1.1 nutzen :)
HotKeyIt
Posts: 1870
Joined: 29 Sep 2013, 18:35
Contact:

Re: AHK v2

11 Mar 2016, 05:11

Für v1 ToInt(), geht jedoch nur mit AHK_H.
v2 "`"" In v1 """".

Edit: ToInt für AHK_L:

Code: Select all

ToInt(num){
	static buf,init:=VarSetCapacity(buf,4)
	NumPut(num+0,&buf,"Int")
	return num:=NumGet(&buf,"Int")
}
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: AHK v2

11 Mar 2016, 05:31

Gar nicht so einfach...
Erstmal Danke für eure Hilfe, hab mir die Seiten mit den ganzen Lib's mal gespeichert.

Aber es will noch nicht so ganz.
Das Script startet, aber sobald man was übersetzen will kommt erneut ein Fehler.

Code: Select all

#NoEnv
#SingleInstance, force
SetBatchLines,-1

s:="Hello World"
 
MsgBox % s:=translate_google(s,"de")

translate_google(str,tl:="",sl:="",proxy:=""){
	ComObjError(false)
	http	:= ComObjCreate("WinHttp.WinHttpRequest.5.1")
	proxy?http.SetProxy(2,proxy):"",tl?"":tl:="en"
	http.open("POST","https://translate.google.com/translate_a/single?client=t&sl=" (sl?sl:"auto") "&tl=" tl "&hl=" tl "&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=3&tsel=3&pc=1&kc=2&tk=" translate_tl(str),1)

	http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
	http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
	http.send("q=" Uri_Encode(str))
	http.WaitForResponse(-1)
	if IsObject(Result:=so(http.responsetext,0)) && IsObject(Result.1) && Result.1.Length()
	for i,n in Result.1
	text.= n.1 " "
	Return text
}

so(s,n:=""){
	static JSON,JSONS,d,y:="`"",j:="`" `t",m:={"\b":Chr(08),"\\":"\","\t":"`t","\n":"`n","\f":Chr(12),"\r":"`r"},gu:="āЁξ"
	if (Type(s)="Object")
	{
		for i,n in s
			str.= (Type(i)="Object"?so(i,1):i+0=""?(gu i gu):i)  ":"  (Type(n)="Object"?so(n,1): n+0=""?(gu n gu):n)  ","
		if !n
		{
			StringReplace, str, %str%,/,\/
			for c,z in m 
				IF InStr(str,z)
				StringReplace, str, %str%,% z,% c
			StringReplace, str, %str%,% y,% "\" y
			StringReplace, str, %str%,% gu,% y
		}
		Return "{" RTrim(str,",") "}"
	}
	if (Type(s)="string")
	{
		f:=[],i:=1
		if n
			b:=StrLen(s)
		else
		{
			if !(s:=Trim(s)) or !regexmatch(s, "[\[\{]")
				Return s
			if JSON:=(n=0) ; so(s,0) JSON
			{
				for c,z in m
					if InStr(s,c)
						StringReplace,s,% s,% c,% z
				StringReplace, s, %s%,\/,/


				if e:=InStr(s,"\u")
					for e,n in StrSplit(SubStr(s, e+2), "\u")
						IF n and !f[b:=SubStr(n, 1, 4)]
						{
							IF d := Abs("0x" b)
								StringReplace,s,% s,% "\u" b,% Chr(d)
							f[b]:=1
						}
			}
			f:=[],b:=StrLen(s),n:=SubStr(s,i,1),d:=0,JSONS:=JSON?"\":"``"
		}

		if (n="{")
			loop
			{
				if ((r?r[0]:"") = "}") or !i or !( i:=RegExMatch(s,"\S",n,i+1) ) or ((n:=n[0]) = "}")
					Return d:=i,f

				if InStr("[{",n)
					 (k:=so(SubStr(s,i),n),i+=d,i:=RegExMatch(s,"\S",t,InStr(s,":",,i)+1),(InStr("[{",t:=i?t[0]:"")
						? (f[SO_JSON(K,JSON) ""]:=so(SubStr(s,i),t),i:=RegExMatch(s,",|\}",r,i+d))
						: ( ((t=y) 	? (p:=InStr(s,y,,i+1),p:=RegExMatch(s,",|\}",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
										: (p:=RegExMatch(s,",|\}",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0))
									,f[SO_JSON(K,JSON) ""]:=SO_JSON(K,JSON),i:=p)) )
				else
					 (x:=InStr(s,":",,(n=y)?InStr(s,y,,i,2):i))
						? (k:= ((n=y)?SubStr(s,i+1,x-i-2):SubStr(s,i,x-i))
							,k:=(n=y ? Trim(k) : n="(" ? SO_Try(Trim(k,"() `t")):Trim(k)),i:=RegExMatch(s,"\S",t,x+1)
							,InStr("[{",t:=i?t[0]:"")
								? (f[SO_JSON(K,JSON)  ""]:=so(SubStr(s,i),t),i:=RegExMatch(s,",|\}",r,i+d))
								: ( ((t=y) 	? (p:=so_InStr(s,i,JSONS),p:=RegExMatch(s,",|\}",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
										: (p:=RegExMatch(s,",|\}",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0))
									,f[SO_JSON(K,JSON)  ""]:=SO_JSON(Z,JSON),i:=p))
						: i:=0
			}

		if (n = "[")
			loop
			{
				if ((r?r[0]:"") = "]") or !i or !( i:=RegExMatch(s,"\S",n,i+1) ) or ((n:=n[0]) = "]")
					Return d:=i,f
				(InStr("[{",n)
					? (f.Push(so(SubStr(s,i),n)),i:=RegExMatch(s,",|\]",r,i+d))
					: (  (n=y) ? (p:=so_InStr(s,i,JSONS),p:=RegExMatch(s,",|\]",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
						: (p:=RegExMatch(s,",|\]",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0),i:=p
						,f.Push(SO_JSON(Z,JSON))))
			}
	}
}

SO_JSON(s,JSON){
	static J:="\`"",P:="`""
	Return JSON AND InStr(s,J)?StrReplace(S,J,P):S
}

SO_InStr(s,i,JSONS){
	while (p:=InStr(s,"""",,i+1)) and (SubStr(s,p-1,1)=JSONS)
		i:=p
	Return p
}

SO_Try(f){
	global
	Try
	Return  (%f%)
}

Uri_Encode(str){
	n := StrPutVar(str, UTF8, "UTF-8"),f:={"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"2d":1,"2e":1,"4a":1,"4b":1,"4c":1,"4d":1,"4e":1,"4f":1,"5a":1,"5f":1,"6a":1,"6b":1,"6c":1,"6d":1,"6e":1,"6f":1,"7a":1,"7e":1}
	loop, strlen(hex:=BintoHex(&UTF8,n))/2-1
		Res .= f[r:=substr(hex, A_index*2-1,2)]?Chr("0x" r):"`%" r
	return Res
}

translate_tl(string){
	a := b :=datediff(time?time:A_NowUTC,"19700101","hours")
	n:= StrPutVar(string,utf8,"UTF-8")
	loop, strlen(hex:=BintoHex(&UTF8, n))/2-1
		a := translate_rl(a + ("0x" substr(hex, A_index*2-1,2)), "+-a^+6")
	a := Mod((0 > (a := translate_rl(a, "+-3^+b+-f"))) ? (a := (a & 2147483647) + 2147483648) : a,10 ** 6)
	return a "." (a ^ b)
}

translate_rl(a, b){
	c := 0
	while c < StrLen(b) - 2
	{
		d := SubStr(b, c+3, 1),d := (d >= "a") ? Ord(d) - 87 : d+0
		,d := (SubStr(b, c+2, 1) ==  "+") ? a >> d : a << d
		,a := (SubStr(b, c+1, 1) == "+") ? (a + d & 4294967295) : a ^ d
		,c += 3
	}
	return ToInt(a)
}

ToInt(num){
	static buf,init:=VarSetCapacity(buf,4)
	NumPut(num+0,&buf,"Int")
	return num:=NumGet(&buf,"Int")
}

Type(Value)
{
    local m, f, e
    if IsObject(Value)
    {
        static nMatchObj  := NumGet(&(m, RegExMatch("", "O)", m)))
        static nBoundFunc := NumGet(&(f := Func("Func").Bind()))
        static nFileObj   := NumGet(&(f := FileOpen("*", "w")))
        static nEnumObj   := NumGet(&(e := ObjNewEnum({})))

        return ObjGetCapacity(Value) != ""  ? "Object"
             : IsFunc(Value)                ? "Func"
             : ComObjType(Value) != ""      ? "ComObject"
             : NumGet(&Value) == nBoundFunc ? "BoundFunc"
             : NumGet(&Value) == nMatchObj  ? "RegExMatchObject"
             : NumGet(&Value) == nFileObj   ? "FileObject"
             : NumGet(&Value) == nEnumObj   ? "Object::Enumerator"
             :                                "Property"
    }
    else if (ObjGetCapacity([Value]) != "")
        return "String"
    else
        return InStr(Value, ".") ? "Float" : "Integer"
}

StrPutVar(Str, ByRef Var, Enc = "")
{
   Len := StrPut(Str, Enc) * (Enc = "UTF-16" || Enc = "CP1200" ? 2 : 1)
   VarSetCapacity(Var, Len, 0)
   Return, StrPut(Str, &Var, Enc)
}

DateDiff(DateTime1, DateTime2, TimeUnits)
{
    EnvSub DateTime1, %DateTime2%, %TimeUnits%
    return DateTime1
}
Magst du vielleicht mal reinschauen?

// EDIT:
Kann man ein Script auch per Variable an die AutoHotkey.dll zum ausführen übergeben?

// EDIT2:
Hab es nun mit AHK v2 per DLL aufruf versucht. Habe mein Script angepasst und fehlende Funktionen hinzugefügt. Aber wenn ich das Script nun nutzen will kommt es zu einem Fehler der wohl aus der MCodeH Funktion kommt.

Hier das komplette Script samt GUI etc für v2

Code: Select all

;============================================================================
; Translate text using Google Translator & Bing Translator in a GUI.
;
;============================================================================
#Persistent
#SingleInstance ignore
OnMessage(0x201, "WM_LBUTTONDOWN") ; Necessary for Guis without caption.
CoordMode, Mouse, Screen
TransMode:=1
;============================================================================
 
;============================================================================
; To = die Sprache zu der im Grunde immer übersetzt werden soll.
; Anti = die Sprache zu der Übersetzt wird wenn Deutsch erkannt wird.
;============================================================================
^t::
TransText:=""
TextToT:=GetTextFromClipboard()
If WinExist(h_GetText)
	{
		GuiControl, GetText:,NewText,%TextToT%
		GoSub NewTranslate
		Return
	}
To:="de"
Anti:="en"
GoSub StartTranslate
Return
;----------------------------------------------------------------------------
; Funktion um Inhalte zu kopieren.
;----------------------------------------------------------------------------
GetTextFromClipboard()
	{
		ClipSaved := ClipboardAll
		Clipboard := ""
		SendInput, ^c
		ClipWait, 0.5
		If ErrorLevel
			{
				Clipboard := ClipSaved
				ClipSaved := ""
				Return
			}
		v := Clipboard
		Clipboard := ClipSaved
		ClipSaved := ""
		Return v
	}
;----------------------------------------------------------------------------
; Wurde kein Inhalt kopiert wird nur die GUI aufgerufen.
;----------------------------------------------------------------------------
StartTranslate:
TranslateTo:=To
if (TextToT="")
	{
		GoSub GetText
		return
	}
else
	GoSub translate
Return
;----------------------------------------------------------------------------
; Startet die Übersetzung
;----------------------------------------------------------------------------
translate:
;if (TransMode=0)
	;TransText:=mTranslate(TextToT, To, Anti)
;else
	TransText:=translate_google(TextToT, To, Anti)
StrReplace, TransText, TransText, \n, `n`r,,1
if (GuiOn=1)
	GuiControl, GetText:,NewTransText,%TransText%
else
	{
		WithText:=1
		Gosub GetText
	}
Return

translate_google(str,tl:="",sl:="",proxy:=""){
	ComObjError(false)
	http	:= ComObjCreate("WinHttp.WinHttpRequest.5.1")
	proxy?http.SetProxy(2,proxy):"",tl?"":tl:="en"
	http.open("POST","https://translate.google.com/translate_a/single?client=t&sl=" (sl?sl:"auto") "&tl=" tl "&hl=" tl "&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=3&tsel=3&pc=1&kc=2&tk=" translate_tl(str),1)

	http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
	http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
	http.send("q=" Uri_Encode(str))
	http.WaitForResponse(-1)
	if IsObject(Result:=so(http.responsetext,0)) && IsObject(Result.1) && Result.1.Length()
	for i,n in Result.1
	text.= n.1 " "
	Return text
}

;----------------------------------------------------------------------------
; Gui zum anzeigen von übersetzen Text oder zur Eingabe von neuem Text.
;----------------------------------------------------------------------------
GetText:
MouseGetPos, TextX, TextY
Gui, GetText:Color, AAAAAA
Gui, GetText:+LastFound +AlwaysOnTop -Caption +ToolWindow +Border +HWNDh_GetText
Gui, GetText:Font, s10
Gui, GetText:Add, Text, x0 y3 w350 h17 +Center, Text der Übersetzt werden soll:
Gui, GetText:Add, Edit, x0 y20 w350 h60 cBlue vNewText +border gNewTranslate,%TextToT%
Gui, GetText:Add, Text, x0 y83 w150 h17 +Center +ReadOnly, Übersetzung:
Gui, GetText:Add, Radio, x155 y83 w80 h17 vTransModeChange1 gTransModeChange, Bing
Gui, GetText:Add, Radio, x240 y83 w80 h17 vTransModeChange2 gTransModeChange, Google
if (TransMode=0)
	GuiControl, GetText:, TransModeChange1, 1
else
	GuiControl, GetText:, TransModeChange2, 1
Gui, GetText:Add, Edit, x0 y100 w350 h60 cGreen +border vNewTransText,%TransText%
Gui, GetText:Add, Text, x0 y163 w350 h17 vLine1, ESC = Schließen - Klicke ins Graue zum verschieben.
Gui, GetText:Font
Gui, GetText:Font, s8
Gui, GetText:Add, Text, x313 y163 w35 h16 +Border cWhite +Center gWithTextGuiClose, close
if (WithText=1)
	GuiControl, GetText:Focus, Line1
else
	GuiControl, GetText:Focus, NewText
Gui, GetText:Show, h180 w350 x%TextX% y%TextY%
Hotkey, Escape, WithTextGuiClose, on
Return
;----------------------------------------------------------------------------
; Ändern des Übersetzers von Google auf Bing oder umgekehrt.
;----------------------------------------------------------------------------
TransModeChange:
GuiControlGet, TransModeChange1
if (TransModeChange1=1)
	TransMode:=0
else
	TransMode:=1
GoSub NewTranslate
Return
;----------------------------------------------------------------------------
; Bei der Eingabe von neuem Text wird direkt neu Übersetzt.
;----------------------------------------------------------------------------
NewTranslate:
GuiControl, GetText:,NewTransText,
GuiControlGet, NewText, GetText:, NewText
if (NewText="")
	GuiControl, GetText:,NewTransText,
GuiOn:=1
TextToT:=NewText
TransText:=""
GoSub translate
Return
;----------------------------------------------------------------------------
; Schließt die GUI und leert die Var's.
;----------------------------------------------------------------------------
WithTextGuiClose:
GuiOn:=0
WithText:=0
TransText:=""
Gui, GetText:Destroy
Hotkey, Escape, WithTextGuiClose, off
Return
;----------------------------------------------------------------------------

;============================================================================
; Funktionen für Google
;============================================================================
so(s,n:=""){
	static JSON,JSONS,d,y:="`"",j:="`" `t",m:={"\b":Chr(08),"\\":"\","\t":"`t","\n":"`n","\f":Chr(12),"\r":"`r"},gu:="āЁξ"
	if (Type(s)="Object")
	{
		for i,n in s
			str.= (Type(i)="Object"?so(i,1):i+0=""?(gu i gu):i)  ":"  (Type(n)="Object"?so(n,1): n+0=""?(gu n gu):n)  ","
		if !n
		{
			StrReplace, str, %str%,/,\/
			for c,z in m 
				IF InStr(str,z)
				StrReplace, str, %str%,% z,% c
			StrReplace, str, %str%,% y,% "\" y
			StrReplace, str, %str%,% gu,% y
		}
		Return "{" RTrim(str,",") "}"
	}
	if (Type(s)="string")
	{
		f:=[],i:=1
		if n
			b:=StrLen(s)
		else
		{
			if !(s:=Trim(s)) or !regexmatch(s, "[\[\{]")
				Return s
			if JSON:=(n=0) ; so(s,0) JSON
			{
				for c,z in m
					if InStr(s,c)
						StrReplace,s,% s,% c,% z
				StrReplace, s, %s%,\/,/


				if e:=InStr(s,"\u")
					for e,n in StrSplit(SubStr(s, e+2), "\u")
						IF n and !f[b:=SubStr(n, 1, 4)]
						{
							IF d := Abs("0x" b)
								StrReplace,s,% s,% "\u" b,% Chr(d)
							f[b]:=1
						}
			}
			f:=[],b:=StrLen(s),n:=SubStr(s,i,1),d:=0,JSONS:=JSON?"\":"``"
		}

		if (n="{")
			loop
			{
				if ((r?r[0]:"") = "}") or !i or !( i:=RegExMatch(s,"\S",n,i+1) ) or ((n:=n[0]) = "}")
					Return d:=i,f

				if InStr("[{",n)
					 (k:=so(SubStr(s,i),n),i+=d,i:=RegExMatch(s,"\S",t,InStr(s,":",,i)+1),(InStr("[{",t:=i?t[0]:"")
						? (f[SO_JSON(K,JSON) ""]:=so(SubStr(s,i),t),i:=RegExMatch(s,",|\}",r,i+d))
						: ( ((t=y) 	? (p:=InStr(s,y,,i+1),p:=RegExMatch(s,",|\}",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
										: (p:=RegExMatch(s,",|\}",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0))
									,f[SO_JSON(K,JSON) ""]:=SO_JSON(K,JSON),i:=p)) )
				else
					 (x:=InStr(s,":",,(n=y)?InStr(s,y,,i,2):i))
						? (k:= ((n=y)?SubStr(s,i+1,x-i-2):SubStr(s,i,x-i))
							,k:=(n=y ? Trim(k) : n="(" ? SO_Try(Trim(k,"() `t")):Trim(k)),i:=RegExMatch(s,"\S",t,x+1)
							,InStr("[{",t:=i?t[0]:"")
								? (f[SO_JSON(K,JSON)  ""]:=so(SubStr(s,i),t),i:=RegExMatch(s,",|\}",r,i+d))
								: ( ((t=y) 	? (p:=so_InStr(s,i,JSONS),p:=RegExMatch(s,",|\}",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
										: (p:=RegExMatch(s,",|\}",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0))
									,f[SO_JSON(K,JSON)  ""]:=SO_JSON(Z,JSON),i:=p))
						: i:=0
			}

		if (n = "[")
			loop
			{
				if ((r?r[0]:"") = "]") or !i or !( i:=RegExMatch(s,"\S",n,i+1) ) or ((n:=n[0]) = "]")
					Return d:=i,f
				(InStr("[{",n)
					? (f.Push(so(SubStr(s,i),n)),i:=RegExMatch(s,",|\]",r,i+d))
					: (  (n=y) ? (p:=so_InStr(s,i,JSONS),p:=RegExMatch(s,",|\]",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
						: (p:=RegExMatch(s,",|\]",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0),i:=p
						,f.Push(SO_JSON(Z,JSON))))
			}
	}
}

SO_JSON(s,JSON){
	static J:="\`"",P:="`""
	Return JSON AND InStr(s,J)?StrReplace(S,J,P):S
}

SO_InStr(s,i,JSONS){
	while (p:=InStr(s,"`"",,i+1)) and (SubStr(s,p-1,1)=JSONS)
		i:=p
	Return p
}

SO_Try(f){
	global
	Try
	Return  (%f%)
}

Uri_Encode(str){
	n := StrPutVar(str, UTF8, "UTF-8"),f:={"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"2d":1,"2e":1,"4a":1,"4b":1,"4c":1,"4d":1,"4e":1,"4f":1,"5a":1,"5f":1,"6a":1,"6b":1,"6c":1,"6d":1,"6e":1,"6f":1,"7a":1,"7e":1}
	loop, strlen(hex:=BintoHex(&UTF8,n))/2-1
		Res .= f[r:=substr(hex, A_index*2-1,2)]?Chr("0x" r):"`%" r
	return Res
}

translate_tl(string){
	a := b :=datediff(time?time:A_NowUTC,"19700101","hours")
	n:= StrPutVar(string,utf8,"UTF-8")
	loop, strlen(hex:=BintoHex(&UTF8, n))/2-1
		a := translate_rl(a + ("0x" substr(hex, A_index*2-1,2)), "+-a^+6")
	a := Mod((0 > (a := translate_rl(a, "+-3^+b+-f"))) ? (a := (a & 2147483647) + 2147483648) : a,10 ** 6)
	return a "." (a ^ b)
}

translate_rl(a, b){
	c := 0
	while c < StrLen(b) - 2
	{
		d := SubStr(b, c+3, 1),d := (d >= "a") ? Ord(d) - 87 : d+0
		,d := (SubStr(b, c+2, 1) ==  "+") ? a >> d : a << d
		,a := (SubStr(b, c+1, 1) == "+") ? (a + d & 4294967295) : a ^ d
		,c += 3
	}
	return ToInt(a)
}

ToInt(ByRef num,buf:=0){
	return num:=NumGet(getvar(buf:=num+0),"Int")
}

StrPutVar(Str, ByRef Var, Enc := "")
{
   Len := StrPut(Str, Enc) * (Enc = "UTF-16" || Enc = "CP1200" ? 2 : 1)
   VarSetCapacity(Var, Len, 0)
   Return, StrPut(Str, &Var, Enc)
}

BinToHex(addr,len) { ; Thanks Laszo
  static b2h
  if !b2h
    b2h:=McodeH(A_PtrSize=8?"4C8BC94585C0744F458BD00F1F440000440FB6024983C10248FFC241C0E8044180E80A410FB6C0C0E805442AC04180C041458841FE0FB64AFF80E10F80E90A0FB6C1C0E8052AC880C14149FFCA418849FF75BD458811C3C60100C3":"558BEC578B7D1085FF74398B4D08568B750C8A06C0E8042C0A8AD0C0EA052AC2044188018A06240F2C0A8AD0C0EA052AC204418841014683C1024F75D55EC601005F5DC38B4508C600005F5DC3","i==ttui")
  VarSetCapacity(hex,2 * len + 1),b2h[&hex,addr,len]
  Return StrGet(&hex,"CP0")
}

MCodeH(h,def,p*){
static f,DynaCalls
If !f
f:={},DynaCalls:={}
If DynaCalls.HasKey(h)
return DynaCalls[h]
f.Insert(h),f.SetCapacity(f.MaxIndex(),len:=StrLen(h)//2)
DllCall("VirtualProtect","PTR",addr:=f.GetAddress(f.MaxIndex()),"Uint",len,"UInt",64,"Uint*",0)
Loop % len
NumPut("0x" SubStr(h,2*A_Index-1,2),addr+0,A_Index-1,"Char")
if p.MaxIndex()
Return DynaCalls[h]:=DynaCall(addr,def,p*)
else Return DynaCalls[h]:=DynaCall(addr,def)
}
;============================================================================
 
WM_LBUTTONDOWN()
{
	if (A_Gui="GetText")
		{
			If (A_GuiControl = "") ; Klick auf den Hintergrund der GUI
				PostMessage, 0xA1, 2, 0 ; sehr sehr alter Trick von SKAN: 0xA1 = WM_NCLBUTTONDOWN
		}
}
Return
HotKeyIt
Posts: 1870
Joined: 29 Sep 2013, 18:35
Contact:

Re: AHK v2

11 Mar 2016, 07:53

AutoHotkey.dll kann auch ein Script von variable starten mit ahktextdll.

Du brauchst die v2 funktionen.

In v2 sind alle Parameter bis auf OutPutVar bei Befehlen strings! StrReplace, TransText, %TransText%, `n, `n`r,,1.

Code: Select all

;============================================================================
; Translate text using Google Translator & Bing Translator in a GUI.
;
;============================================================================
#Persistent
#SingleInstance ignore
OnMessage(0x201, "WM_LBUTTONDOWN") ; Necessary for Guis without caption.
CoordMode, Mouse, Screen
TransMode:=1
;============================================================================
 
;============================================================================
; To = die Sprache zu der im Grunde immer übersetzt werden soll.
; Anti = die Sprache zu der Übersetzt wird wenn Deutsch erkannt wird.
;============================================================================
^t::
TransText:=""
TextToT:=GetTextFromClipboard()
If WinExist(h_GetText)
	{
		GuiControl, GetText:,NewText,%TextToT%
		GoSub NewTranslate
		Return
	}
To:="de"
Anti:="en"
GoSub StartTranslate
Return
;----------------------------------------------------------------------------
; Funktion um Inhalte zu kopieren.
;----------------------------------------------------------------------------
GetTextFromClipboard()
{
	ClipSaved := ClipboardAll
	Clipboard := ""
	SendInput, ^c
	ClipWait, 0.5
	If ErrorLevel
		{
			Clipboard := ClipSaved
			ClipSaved := ""
			Return
		}
	v := Clipboard
	Clipboard := ClipSaved
	ClipSaved := ""
	Return v
}
;----------------------------------------------------------------------------
; Wurde kein Inhalt kopiert wird nur die GUI aufgerufen.
;----------------------------------------------------------------------------
StartTranslate:
TranslateTo:=To
if (TextToT="")
	{
		GoSub GetText
		return
	}
else
	GoSub translate
Return
;----------------------------------------------------------------------------
; Startet die Übersetzung
;----------------------------------------------------------------------------
translate:
;if (TransMode=0)
	;TransText:=mTranslate(TextToT, To, Anti)
;else
	TransText:=translate_google(TextToT, To, Anti)
StrReplace, TransText, %TransText%, `n, `n`r,,1
if (GuiOn=1)
	GuiControl, GetText:,NewTransText,%TransText%
else
	{
		WithText:=1
		Gosub GetText
	}
Return
 
translate_google(str,tl:="",sl:="",proxy:=""){
	ComObjError(false)
	http	:= ComObjCreate("WinHttp.WinHttpRequest.5.1")
	proxy?http.SetProxy(2,proxy):"",tl?"":tl:="en"
	http.open("POST","https://translate.google.com/translate_a/single?client=t&sl=" (sl?sl:"auto") "&tl=" tl "&hl=" tl "&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=3&tsel=3&pc=1&kc=2&tk=" translate_tl(str),1)
 
	http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
	http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
	http.send("q=" Uri_Encode(str))
	http.WaitForResponse(-1)
	if IsObject(Result:=so(http.responsetext,0)) && IsObject(Result.1) && Result.1.Length()
	for i,n in Result.1
	text.= n.1 " "
	Return text
}
 
;----------------------------------------------------------------------------
; Gui zum anzeigen von übersetzen Text oder zur Eingabe von neuem Text.
;----------------------------------------------------------------------------
GetText:
MouseGetPos, TextX, TextY
Gui, GetText:Color, AAAAAA
Gui, GetText:+LastFound +AlwaysOnTop -Caption +ToolWindow +Border +HWNDh_GetText
Gui, GetText:Font, s10
Gui, GetText:Add, Text, x0 y3 w350 h17 +Center, Text der Übersetzt werden soll:
Gui, GetText:Add, Edit, x0 y20 w350 h60 cBlue vNewText +border gNewTranslate,%TextToT%
Gui, GetText:Add, Text, x0 y83 w150 h17 +Center +ReadOnly, Übersetzung:
Gui, GetText:Add, Radio, x155 y83 w80 h17 vTransModeChange1 gTransModeChange, Bing
Gui, GetText:Add, Radio, x240 y83 w80 h17 vTransModeChange2 gTransModeChange, Google
if (TransMode=0)
	GuiControl, GetText:, TransModeChange1, 1
else
	GuiControl, GetText:, TransModeChange2, 1
Gui, GetText:Add, Edit, x0 y100 w350 h60 cGreen +border vNewTransText,%TransText%
Gui, GetText:Add, Text, x0 y163 w350 h17 vLine1, ESC = Schließen - Klicke ins Graue zum verschieben.
Gui, GetText:Font
Gui, GetText:Font, s8
Gui, GetText:Add, Text, x313 y163 w35 h16 +Border cWhite +Center gWithTextGuiClose, close
if (WithText=1)
	GuiControl, GetText:Focus, Line1
else
	GuiControl, GetText:Focus, NewText
Gui, GetText:Show, h180 w350 x%TextX% y%TextY%
Hotkey, Escape, WithTextGuiClose, on
Return
;----------------------------------------------------------------------------
; Ändern des Übersetzers von Google auf Bing oder umgekehrt.
;----------------------------------------------------------------------------
TransModeChange:
GuiControlGet, TransModeChange1
if (TransModeChange1=1)
	TransMode:=0
else
	TransMode:=1
GoSub NewTranslate
Return
;----------------------------------------------------------------------------
; Bei der Eingabe von neuem Text wird direkt neu Übersetzt.
;----------------------------------------------------------------------------
NewTranslate:
GuiControl, GetText:,NewTransText,
GuiControlGet, NewText, GetText:, NewText
if (NewText="")
	GuiControl, GetText:,NewTransText,
GuiOn:=1
TextToT:=NewText
TransText:=""
GoSub translate
Return
;----------------------------------------------------------------------------
; Schließt die GUI und leert die Var's.
;----------------------------------------------------------------------------
WithTextGuiClose:
GuiOn:=0
WithText:=0
TransText:=""
Gui, GetText:Destroy
Hotkey, Escape, WithTextGuiClose, off
Return
;----------------------------------------------------------------------------
 
;============================================================================
; Funktionen für Google
;============================================================================
so(s,n:=""){
	static JSON,JSONS,d,y:="`"",j:="`" `t",m:={"\b":Chr(08),"\\":"\","\t":"`t","\n":"`n","\f":Chr(12),"\r":"`r"},gu:="āЁξ"
	if (Type(s)="Object")
	{
		for i,n in s
			str.= (Type(i)="Object"?so(i,1):i+0=""?(gu i gu):i)  ":"  (Type(n)="Object"?so(n,1): n+0=""?(gu n gu):n)  ","
		if !n
		{
			StrReplace, str, %str%,/,\/
			for c,z in m 
				IF InStr(str,z)
				StrReplace, str, %str%,% z,% c
			StrReplace, str, %str%,% y,% "\" y
			StrReplace, str, %str%,% gu,% y
		}
		Return "{" RTrim(str,",") "}"
	}
	if (Type(s)="string")
	{
		f:=[],i:=1
		if n
			b:=StrLen(s)
		else
		{
			if !(s:=Trim(s)) or !regexmatch(s, "[\[\{]")
				Return s
			if JSON:=(n=0) ; so(s,0) JSON
			{
				for c,z in m
					if InStr(s,c)
						StrReplace,s,% s,% c,% z
				StrReplace, s, %s%,\/,/
 
 
				if e:=InStr(s,"\u")
					for e,n in StrSplit(SubStr(s, e+2), "\u")
						IF n and !f[b:=SubStr(n, 1, 4)]
						{
							IF d := Abs("0x" b)
								StrReplace,s,% s,% "\u" b,% Chr(d)
							f[b]:=1
						}
			}
			f:=[],b:=StrLen(s),n:=SubStr(s,i,1),d:=0,JSONS:=JSON?"\":"``"
		}
 
		if (n="{")
			loop
			{
				if ((r?r[0]:"") = "}") or !i or !( i:=RegExMatch(s,"\S",n,i+1) ) or ((n:=n[0]) = "}")
					Return d:=i,f
 
				if InStr("[{",n)
					 (k:=so(SubStr(s,i),n),i+=d,i:=RegExMatch(s,"\S",t,InStr(s,":",,i)+1),(InStr("[{",t:=i?t[0]:"")
						? (f[SO_JSON(K,JSON) ""]:=so(SubStr(s,i),t),i:=RegExMatch(s,",|\}",r,i+d))
						: ( ((t=y) 	? (p:=InStr(s,y,,i+1),p:=RegExMatch(s,",|\}",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
										: (p:=RegExMatch(s,",|\}",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0))
									,f[SO_JSON(K,JSON) ""]:=SO_JSON(K,JSON),i:=p)) )
				else
					 (x:=InStr(s,":",,(n=y)?InStr(s,y,,i,2):i))
						? (k:= ((n=y)?SubStr(s,i+1,x-i-2):SubStr(s,i,x-i))
							,k:=(n=y ? Trim(k) : n="(" ? SO_Try(Trim(k,"() `t")):Trim(k)),i:=RegExMatch(s,"\S",t,x+1)
							,InStr("[{",t:=i?t[0]:"")
								? (f[SO_JSON(K,JSON)  ""]:=so(SubStr(s,i),t),i:=RegExMatch(s,",|\}",r,i+d))
								: ( ((t=y) 	? (p:=so_InStr(s,i,JSONS),p:=RegExMatch(s,",|\}",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
										: (p:=RegExMatch(s,",|\}",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0))
									,f[SO_JSON(K,JSON)  ""]:=SO_JSON(Z,JSON),i:=p))
						: i:=0
			}
 
		if (n = "[")
			loop
			{
				if ((r?r[0]:"") = "]") or !i or !( i:=RegExMatch(s,"\S",n,i+1) ) or ((n:=n[0]) = "]")
					Return d:=i,f
				(InStr("[{",n)
					? (f.Push(so(SubStr(s,i),n)),i:=RegExMatch(s,",|\]",r,i+d))
					: (  (n=y) ? (p:=so_InStr(s,i,JSONS),p:=RegExMatch(s,",|\]",r,p),z:=Trim(SubStr(s,i+1,p-i-2))) 
						: (p:=RegExMatch(s,",|\]",r,i),z:=Trim(SubStr(s,i,p-i)),z:=z+0=""?SO_Try(z):z+0),i:=p
						,f.Push(SO_JSON(Z,JSON))))
			}
	}
}
 
SO_JSON(s,JSON){
	static J:="\`"",P:="`""
	Return JSON AND InStr(s,J)?StrReplace(S,J,P):S
}
 
SO_InStr(s,i,JSONS){
	while (p:=InStr(s,"`"",,i+1)) and (SubStr(s,p-1,1)=JSONS)
		i:=p
	Return p
}
 
SO_Try(f){
	global
	Try
	Return  (%f%)
}
 
Uri_Encode(str){
	n := StrPutVar(str, UTF8, "UTF-8"),f:={"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"2d":1,"2e":1,"4a":1,"4b":1,"4c":1,"4d":1,"4e":1,"4f":1,"5a":1,"5f":1,"6a":1,"6b":1,"6c":1,"6d":1,"6e":1,"6f":1,"7a":1,"7e":1}
	loop, strlen(hex:=BintoHex(&UTF8,n))/2-1
		Res .= f[r:=substr(hex, A_index*2-1,2)]?Chr("0x" r):"`%" r
	return Res
}
 
translate_tl(string){
	a := b :=datediff(time?time:A_NowUTC,"19700101","hours")
	n:= StrPutVar(string,utf8,"UTF-8")
	loop, strlen(hex:=BintoHex(&UTF8, n))/2-1
		a := translate_rl(a + ("0x" substr(hex, A_index*2-1,2)), "+-a^+6")
	a := Mod((0 > (a := translate_rl(a, "+-3^+b+-f"))) ? (a := (a & 2147483647) + 2147483648) : a,10 ** 6)
	return a "." (a ^ b)
}
 
translate_rl(a, b){
	c := 0
	while c < StrLen(b) - 2
	{
		d := SubStr(b, c+3, 1),d := (d >= "a") ? Ord(d) - 87 : d+0
		,d := (SubStr(b, c+2, 1) ==  "+") ? a >> d : a << d
		,a := (SubStr(b, c+1, 1) == "+") ? (a + d & 4294967295) : a ^ d
		,c += 3
	}
	return ToInt(a)
}
 
ToInt(ByRef num,buf:=0){
	return num:=NumGet(getvar(buf:=num+0),"Int")
}
 
StrPutVar(Str, ByRef Var, Enc := "")
{
   Len := StrPut(Str, Enc) * (Enc = "UTF-16" || Enc = "CP1200" ? 2 : 1)
   VarSetCapacity(Var, Len, 0)
   Return, StrPut(Str, &Var, Enc)
}
 
BinToHex(addr,len) { ; Thanks Laszo
  static b2h
  if !b2h
    b2h:=McodeH(A_PtrSize=8?"4C8BC94585C0744F458BD00F1F440000440FB6024983C10248FFC241C0E8044180E80A410FB6C0C0E805442AC04180C041458841FE0FB64AFF80E10F80E90A0FB6C1C0E8052AC880C14149FFCA418849FF75BD458811C3C60100C3":"558BEC578B7D1085FF74398B4D08568B750C8A06C0E8042C0A8AD0C0EA052AC2044188018A06240F2C0A8AD0C0EA052AC204418841014683C1024F75D55EC601005F5DC38B4508C600005F5DC3","i==ttui")
  VarSetCapacity(hex,2 * len + 1),b2h[&hex,addr,len]
  Return StrGet(&hex,"CP0")
}
 
MCodeH(h,def,p*){
static f,DynaCalls
If !f
f:={},DynaCalls:={}
If DynaCalls.HasKey(h)
return DynaCalls[h]
f.Push(h),f.SetCapacity(f.Length(),len:=StrLen(h)//2)
DllCall("VirtualProtect","PTR",addr:=f.GetAddress(f.Length()),"Uint",len,"UInt",64,"Uint*",0)
Loop len
NumPut("0x" SubStr(h,2*A_Index-1,2),addr,A_Index-1,"Char")
if p.Length()
Return DynaCalls[h]:=DynaCall(addr,def,p*)
else Return DynaCalls[h]:=DynaCall(addr,def)
}
;============================================================================
 
WM_LBUTTONDOWN()
{
	if (A_Gui="GetText")
		{
			If (A_GuiControl = "") ; Klick auf den Hintergrund der GUI
				PostMessage, 0xA1, 2, 0 ; sehr sehr alter Trick von SKAN: 0xA1 = WM_NCLBUTTONDOWN
		}
}
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: AHK v2

11 Mar 2016, 08:18

Vielen Dank!

Wird v2 das aktuelle AHK komplett ersetzen? Sprich wird die Entwicklung von v1.1 eingestellt?


// Edit:

Ist es unter v2 nicht möglich If WinExist() mit einer HWND zu nutzen? In der Dokumentation finde ich das nicht.
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: AHK v2

11 Mar 2016, 09:55

Jetzt bin ich verwirrt.
In der Dokumentation steht, dass Process durchaus verwendbar ist.
Jedoch teilt mir AHK mit, dass ihm diese Funktion unbekannt sei...

Was ist da los?
Coco
Posts: 771
Joined: 29 Sep 2013, 20:37
GitHub: cocobelgica

Re: AHK v2

11 Mar 2016, 10:13

v2-changes wrote:Sub-Commands
Sub-commands of WinGet, WinSet and Process have been replaced with individual functions, and the main commands have been removed. Excluding the obsolete Cmd/Attribute parameter, usage is the same as before except for the following sub-commands:
  • WinSet Enable/Disable -> WinSetEnabled On/Off/Toggle/1/0, WinTitle, etc.
  • WinSet Top/Bottom -> WinMoveTop/WinMoveBottom, WinTitle, etc.
  • WinSet Redraw -> WinRedraw, WinTitle, etc.
  • Process Priority -> ProcessSetPriority, Priority, PID-or-Name
  • WinSet Topmost and Trans were removed. Use WinSetAlwaysOnTop and WinSetTransparent instead.
  • WinGet ControlList -> WinGetControls (returns an array).
  • WinGet ControlListHwnd -> WinGetControlsHwnd (returns an array).
When called using function syntax, all WinSet' functions return 1 on success, 0 on failure, while ErrorLevel is set to 0 on success, 1 on failure.

Source: Changes from v1.1 to v2.0
ProcessExist(PIDorName)
ProcessClose(PIDorName)
ProcessSetPriority(Priority, PIDorName)
ProcessWait(PIDorName, SecondsToWait)
ProcessWaitClose(PIDorName, SecondsToWait)
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: AHK v2

11 Mar 2016, 10:31

Okay dann ist das in der Doku aber nicht korrekt... http://ragnar-f.github.io/v2/docs/commands/Process.htm

Danke
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: AHK v2

15 Mar 2016, 03:57

Hallo erneut :)

Also ich habe etwas weiter gebastelt und komme jetzt nicht weiter.
Ich will das Script beenden können und das auch dann wenn es mal hängen sollte. Einfachster Weg der mir da einfällt, wäre per HWND und Process, Close.

Nun da ich das Script per Variable an die DLL übergebe und es dann ausgeführt wird, warum funktioniert F6 nicht?
Es kommt lediglich der standard Text wenn man nur msgbox ausführt.

Code: Select all

#NoEnv
#Persistent
#SingleInstance force

script=
(
#Persistent
#SingleInstance force

F4::
MsgBox Hello World!
Return

F6::
h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr")
Msgbox %h%
Return
)

DllCall("LoadLibrary","Str",ahkdll:=A_ScriptDir "\AutoHotkey.dll")
hNewThread := DllCall(ahkdll "\ahktextdll","Str",script,"Str","","CDecl")

msgbox %hNewThread%
Verstehe ich hier etwas falsch?
Wie kann ich das per DLL ausgeführte Script beenden falls es nicht mehr so reagiert wie es gewünscht ist?

Kann man zwischen den Scripts per OnMessage/SendMessage Daten verschicken? Also geht das auch dann, wenn ein V1 Script an ein per DLL gestartetes V2 Script etwas senden will? Ansich sollte die Message das ja nicht stören oder?
just me
Posts: 6486
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: AHK v2

15 Mar 2016, 04:30

Moin,

was, glaubst Du, steht in ErrorLevel, das an OpenProcess() übergeben wird?
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: AHK v2

15 Mar 2016, 04:48

Ja, klar hast recht, Errorlevel ist leer... Aber wie komme ich an die PID?
In der v2 Hilfe steht in Process dasselbe wie in der v1 Hilfe was ja leider nicht korrekt ist.
Mit ProcessExist("A") bekomme ich aber keine PID.

Steh auf dem Schlauch...
just me
Posts: 6486
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: AHK v2

15 Mar 2016, 05:03

Erst einmal steht in der v1-Hilfe auch ein schöner DllCall GetCurrrentProcessID, und außerdem ist A eine Option für Fenstertitel. Lass den Parameter einfach weg, oder übergebe "", falls das in v2 nicht funktioniert.

Was hast Du mit OpenProcess() eigentlich vor?
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: AHK v2

15 Mar 2016, 05:10

Ich gebe zu ich habe nicht genau gelesen. Ich brauche nicht den Handle sondern die PID.
Ich habe einfach Versucht zu einem Ergebnis zu kommen. Da das A immer wieder auftaucht hab ich auch dies mal versucht :)

Der DllCall will in v2 nicht. In v1 funktioniert es wunderbar.

Code: Select all

#NoEnv
#Persistent
#SingleInstance ignore

script=
(
#Persistent
#SingleInstance ignore

F4::
MsgBox Hello World!
Return

F6::
PID := DllCall("GetCurrentProcessId")
Msgbox %PID%
Return
)

DllCall("LoadLibrary","Str",ahkdll:=A_ScriptDir "\AutoHotkey.dll")
hNewThread := DllCall(ahkdll "\ahktextdll","Str",script,"Str","","CDecl")
PID := DllCall("GetCurrentProcessId")

msgbox %PID%
Auch PID := ProcessExist("") funktioniert nicht.
just me
Posts: 6486
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: AHK v2

15 Mar 2016, 05:20

Du kannst das noch mal versuchen:
PID := DllCall("GetCurrentProcessId", "Ptr")
Ansonsten musst Du HotkeyIt fragen.
User avatar
jNizM
Posts: 2503
Joined: 30 Sep 2013, 01:33
GitHub: jNizM
Contact:

Re: AHK v2

15 Mar 2016, 05:23

Funktioniert doch

Code: Select all

MsgBox % A_AhkVersion " " (A_IsUnicode ? "Unicode" : "ANSI") " " (A_PtrSize * 8) "-bit    (" (A_IsCompiled ? ".exe" : ".ahk") ")`nPID: " DllCall("GetCurrentProcessId")

Code: Select all

2.0-a074-9bc9379 Unicode 64-bit    (.ahk)
PID: 4192
btw just me, wäre DWORD nicht ein UInt?
[AHK] 1.1.30.03 x64 Unicode | [WIN] 10 Pro (Version 1903) x64 | [GitHub] Profile
Donations are appreciated if I could help you

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 4 guests