Browserfenster zu 100% Identifizieren

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

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

Browserfenster zu 100% Identifizieren

Post by fump2000 » 07 Nov 2013, 07:04

Hallo zusammen,

neues Tool, neue Probleme.

Ich hatte das mit den Fenstern schonmal im alten Forum angesprochen aber so ganz wills nicht funktionieren.

Daher hier nochmal.

Problem: Wir nutzen einige Tools im Webbrowser. Eins davon besonders oft. Es darf nicht mehrmals im gleichen Browser geöffnet sein da es sonst zur vermischung von Kundendaten kommen kann. Daher nutzen wir die drei gängigen Browser IE, Chrome und FireFox.

Ich möchte nun ein Tool schreiben welches diese Browser steuert. Kundendaten öffnet etc. Dazu will ich dem User über eine GUI die Möglichkeit geben zu entscheiden welcher Browser aktuell genutzt werden soll. Man klickt also auf den Namen des gewünschten Browsers. Dann soll geprüft werden ob dieser schon aktiv ist und wenn nicht soll er neu gestartet werden mit dem Link des Tools.

Nun, die Sache ist die... Beim IE haben alle Instanzen die gleiche ProzessID nur die HWND ändert sich. Beim Chrome hat jede Instanz eine eigene PID und jeder Tab eine eigene HWND. Beim FireFox ist es wie beim IE.

Ich weiß jetzt nicht wie ich da weiter vorgehen kann. Ich will es so eindeutig wie möglich haben. Sehe aber keinen Weg den vom Tool aus gestarteten Browser zu 100% zu identifizieren.

Nebenbei, wie kann man beim FF per RUN eine neue instanz öffnen?

Folgendes Szenario: User klickt auf IE, IE öffnet sich und die Arbeiten werden durchgeführt. Nun kommt ein weiteres Kundenkonto zum bearbeiten, der User ist im alten aber noch nicht fertig. Also klickt er auf Chrome um dort den 2. Kunden zu bearbeiten. Dann ist er mit dem ersten fertig und schließt dieses IE Fenster. Nun kommt ein 3. Kunde Klickt man nun im Tool wieder auf IE passiert nix... es passiert nix weil im Hintergrund noch ein IE Fenster auf ist indem sich andere Tools befinden die aber weniger oft genutzt werden.

Ich hoffe das ist einigermaßen verständlich... :)

Hier mein Script:

Code: Select all

#SingleInstance force
OnMessage(0x201, "WM_LBUTTONDOWN")

PIDIE:=0
PIDCH:=0
PIDFF:=0

IEPfad:="C:\Program Files (x86)\Internet Explorer\iexplore.exe"
ChromePfad:="C:\Users\fump\Desktop\GoogleChromePortable\App\Chrome-bin\chrome.exe"
FireFoxPfad:="C:\Users\fump\Desktop\FirefoxPortable\Portable_Firefox_9.0\Firefox\firefox.exe"

UseLink:="http://google.de"

Menu, AAXcom, Add, Reload, ReloadAAXcom
Menu, AAXcom, Add, Schließen, CloseAAXcom
	
	
Gui, AAXcom:Font, S8 CBlack, Candara
Gui, AAXcom:Color, fff875
Gui, AAXcom:+AlwaysOnTop -caption +Border +ToolWindow +LastFound
Gui, AAXcom:Add, Text, x5 y2 w50 h14 Border Center vBrowser1 gBrowserChange HWNDh_IE, IE
Gui, AAXcom:Add, Text, x60 y2 w20 h14 Center, ID:
Gui, AAXcom:Add, Text, x80 y2 w40 h14 Center vID1, 
Gui, AAXcom:Add, Text, x125 y2 w50 h14 Border Center vBrowser2 gBrowserChange HWNDh_CH, Chrome
Gui, AAXcom:Add, Text, x180 y2 w20 h14 Center, ID:
Gui, AAXcom:Add, Text, x200 y2 w40 h14 Center vID2, 
Gui, AAXcom:Add, Text, x245 y2 w50 h14 Border Center vBrowser3 gBrowserChange HWNDh_FF, FireFox
Gui, AAXcom:Add, Text, x300 y2 w20 h14 Center, ID:
Gui, AAXcom:Add, Text, x320 y2 w40 h14 Center vID3, 
Gui, AAXcom:Show, x0 y0 h18 w365, New GUI Window
WinSet, Transparent, 220
Return

BrowserChange:
If (A_GuiControl="Browser1")
	{
		If (BrowserInUse!="IE")
			{
				Process, Exist, %PIDIE%
				If (Errorlevel=0)
					{
						Matchmode:=A_TitleMatchMode
						SetTitleMatchMode, RegEx
						Run,%IEPfad% %UseLink%
						WinWaitActive,ahk_class IEFrame,,5
						if (Errorlevel=1)
							{
								SetTitleMatchMode, %Matchmode%
								msgbox, 4144, Fehler beim Browserstart, Leider konnnte der Browser innerhalb von 5 Sekunden nicht korrekt gestartet/erkannt werden. Bitte versuche es erneut.
								Return
							}
						else
							{
								SetTitleMatchMode, %Matchmode%
								WinGet, PIDIE , PID
								WinGet, HWNDIE , ID
								msgbox %HWNDIE%
								GuiControl, AAXcom:, ID1, %PIDIE%
								CTLCOLORS.Detach(h_CH%ClipNum%)
								CTLCOLORS.Detach(h_FF%ClipNum%)
								CTLCOLORS.Attach(h_IE, "FFFFFF", "000000")
							}
						
					}
				else
					{
						CTLCOLORS.Detach(h_CH%ClipNum%)
						CTLCOLORS.Detach(h_FF%ClipNum%)
						CTLCOLORS.Attach(h_IE, "FFFFFF", "000000")
					}
				BrowserInUse:="IE"
			}
		else
			{
				Process, Exist, %PIDIE%
				If (Errorlevel=0)
					{
						Run,%IEPfad% %UseLink%,,,PIDIE
						GuiControl, AAXcom:, ID1, %PIDIE%
					}
			}
	}
If (A_GuiControl="Browser2")
	{
		If (BrowserInUse!="CH")
			{
				Process, Exist, %PIDCH%
				If (Errorlevel=0)
					{
						Matchmode:=A_TitleMatchMode
						SetTitleMatchMode, RegEx
						Run,%ChromePfad% %UseLink%
						WinWaitActive,ahk_class Chrome_WidgetWin,,5
						if (Errorlevel=1)
							{
								SetTitleMatchMode, %Matchmode%
								msgbox, 4144, Fehler beim Browserstart, Leider konnnte der Browser innerhalb von 5 Sekunden nicht korrekt gestartet/erkannt werden. Bitte versuche es erneut.
								Return
							}
						else
							{
								SetTitleMatchMode, %Matchmode%
								WinGet, PIDCH , PID
								WinGet, HWNDCH , ID
								msgbox %HWNDCH%
								GuiControl, AAXcom:, ID2, %PIDCH%
								CTLCOLORS.Detach(h_IE%ClipNum%)
								CTLCOLORS.Detach(h_FF%ClipNum%)
								CTLCOLORS.Attach(h_CH, "FFFFFF", "000000")
							}
					}
				else
					{
						CTLCOLORS.Detach(h_IE%ClipNum%)
						CTLCOLORS.Detach(h_FF%ClipNum%)
						CTLCOLORS.Attach(h_CH, "FFFFFF", "000000")
					}
				BrowserInUse:="CH"
			}
		else
			{
				Process, Exist, %PIDCH%
				If (Errorlevel=0)
					{
						Run,%ChromePfad% %UseLink%,,,PIDCH
						GuiControl, AAXcom:, ID2, %PIDCH%
					}
			}
	}
If (A_GuiControl="Browser3")
	{
		If (BrowserInUse!="FF")
			{
				Process, Exist, %PIDFF%
				If (Errorlevel=0)
					{
						Matchmode:=A_TitleMatchMode
						SetTitleMatchMode, RegEx
						Run,%FireFoxPfad% %UseLink%
						WinWaitActive,ahk_class MozillaWindowClass,,5
						if (Errorlevel=1)
							{
								SetTitleMatchMode, %Matchmode%
								msgbox, 4144, Fehler beim Browserstart, Leider konnnte der Browser innerhalb von 5 Sekunden nicht korrekt gestartet/erkannt werden. Bitte versuche es erneut.
								Return
							}
						else
							{
								SetTitleMatchMode, %Matchmode%
								WinGet, PIDFF , PID
								WinGet, HWNDFF , ID
								msgbox %HWNDFF%
								GuiControl, AAXcom:, ID3, %PIDFF%
								CTLCOLORS.Detach(h_IE%ClipNum%)
								CTLCOLORS.Detach(h_CH%ClipNum%)
								CTLCOLORS.Attach(h_FF, "FFFFFF", "000000")
							}
					}
				else
					{
						CTLCOLORS.Detach(h_IE%ClipNum%)
						CTLCOLORS.Detach(h_CH%ClipNum%)
						CTLCOLORS.Attach(h_FF, "FFFFFF", "000000")
					}
				BrowserInUse:="FF"
			}
		else
			{
				Process, Exist, %PIDFF%
				If (Errorlevel=0)
					{
						Run,%FireFoxPfad% %UseLink%,,,PIDFF
						GuiControl, AAXcom:, ID3, %PIDFF%
					}
			}
	}
Return

AAXcomGuiContextMenu:
Menu, AAXcom, Show, %A_GuiX%, %A_GuiY%
Return

CloseAAXcom:
ExitApp

ReloadAAXcom:
OnExit,
Reload
Return

WM_LBUTTONDOWN()
{
	if (A_Gui="AAXcom")
		{
			If (A_GuiControl = "") ; Klick auf den Hintergrund der GUI
				PostMessage, 0xA1, 2, 0 ; sehr sehr alter Trick von SKAN: 0xA1 = WM_NCLBUTTONDOWN
		}
}

; Classe um Controls Farbig zu gestalten
#Include Class_CTLCOLORS.ahk
Danke im voraus!

MfG
fump
Attachments
Class_CTLCOLORS.zip
Classe von just me
(3.81 KiB) Downloaded 142 times

strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Browserfenster zu 100% Identifizieren

Post by strobo » 07 Nov 2013, 13:30

chrome ist okay, wegen eigener pid?
firefox ist nicht okay, wegen ohne eigene pid?
. eigenes hwnd geht nicht?
.. wegen hwnd pro tab und nicht pro fenster?
.. weil du das fenster-hwnd des gestarteten prozesses nicht einfangen kannst?

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

Re: Browserfenster zu 100% Identifizieren

Post by fump2000 » 07 Nov 2013, 15:18

Ja... beim IE und beim FF kann ich das HWND nicht einfangen weil ich nicht weiß auf was ich warten soll. Die Classen existieren ja im zweifel schon weil ein weiteres Fenster mit anderen Tabs und Seiten offen ist.

Ich komm da nicht weiter. Ich will es aber unbedingt realisieren. Irgendwie muss es doch was geben das da helfen kann?

strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Browserfenster zu 100% Identifizieren

Post by strobo » 07 Nov 2013, 15:38

Sollte so gehen (edit: hwnd-bestimmung geschleift):
hole dir die hwnd der vorhandenen Fenster der Browser-Class (z.b. FF) mit

Code: Select all

WinGet, OutputVar, List, ...
starte den Browser
loop{
sleep
hole dir nochmal die "gleiche" hwnd Liste (s.o.)
ein hwnd, das auf der neuen Liste aber nicht auf der alten ist, ist wahrscheinlich dein gesuchtes hwnd.
wenn hwnd gefunden (oder zuoft geloopt), break loop.
}
Last edited by strobo on 08 Nov 2013, 07:52, edited 1 time in total.

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

Re: Browserfenster zu 100% Identifizieren

Post by fump2000 » 07 Nov 2013, 15:49

Kann man ein HWND aktivieren? Per WinActivate? Also auch dann wenn man einen anderen Tab offen hat?

Kann das hier vllt helfen? http://www.autohotkey.com/board/topic/7 ... -09272012/

Das hier gehört auch noch dazu: http://www.autohotkey.com/forum/viewtop ... 649#518649

Werd leider nicht ganz schlau daraus. Aber vielleicht kennts ja einer von euch :)
Attachments
ACC.zip
(1.56 KiB) Downloaded 163 times

User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Browserfenster zu 100% Identifizieren

Post by nnnik » 08 Nov 2013, 00:44

Du kannst es einfach versuchen.
BTW: CreateWindowEx
Recommends AHK Studio

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

Re: Browserfenster zu 100% Identifizieren

Post by fump2000 » 08 Nov 2013, 02:03

Wie benutzt man das?

Dieses DLLCall versteh ich nicht. Mir leuchtet auch nicht ein wie ich damit ein IE oder Chrome oder FF Fenster erzeugen soll...

Mit dem ACC komm ich nicht weiter. Ich versteh die funktionen nicht und finde keine passenden Beispiele :(

Help please :?

// Edit
Stelle grad fest, das nicht jedes Tab einen neuen HWND bekommt sondern nur eine neue IE Instanz. Die neue Instanz hat zwar die gleiche PID aber eben eine andere HWND. Beim FF ist es noch schlimmer, da hat alles nur eine PID und die gleiche HWND. Wie soll man da noch weiter unterscheiden?

Also IE = Eine PID egal wieviele Fenster. Je Fenster eine eigene HWND
Chrome = Je Fenster eine PID und HWND.
FireFox = Eine PID und nur eine HWND egal wieviele Fenster.

just me
Posts: 9576
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Browserfenster zu 100% Identifizieren

Post by just me » 08 Nov 2013, 04:28

Hallo,

für Firefox habe ich :arrow: das gefunden. Danach kann man mit firefox.exe -new-window <url> Firefox in einem neuen Fenster starten, das dann auch ein eigenes HWND hat. Alternativ sollte auch ein Send, {Ctrl}n an ein aktives Firefox Fenster ein neues Fenster mit eigenem HWND öffnen.

User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Browserfenster zu 100% Identifizieren

Post by nnnik » 08 Nov 2013, 08:48

Mit CreateWindowEx werden alle Windows und Controls erstellt.
Es soll dir helfen den Hintergrund zu verstehen und so dafür sorgen , dass du dir selber helfen kannst.
Recommends AHK Studio

just me
Posts: 9576
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Browserfenster zu 100% Identifizieren

Post by just me » 08 Nov 2013, 09:07

Welchen Hintergrund hat CreateWindowEx im Zusammenhang mit Firefox- oder Chrome-Fenstern?

User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Browserfenster zu 100% Identifizieren

Post by nnnik » 08 Nov 2013, 09:27

Es geht nur um die Frage:
Kann man ein HWND aktivieren? Per WinActivate? Also auch dann wenn man einen anderen Tab offen hat?
Recommends AHK Studio

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

Re: Browserfenster zu 100% Identifizieren

Post by fump2000 » 08 Nov 2013, 09:31

Danke just me das klappt wunderbar.

Ich hab es nun soweit, dass mir der HWND des jeweiligen Fensters bekannt ist. Das funktioniert soweit gut. Aber ich bekomm den Tab nicht aktiviert.

Ich hab versucht das mit dem ACC zu machen. Habe einen Thread gefunden wo das beschrieben wird. Link: http://www.autohotkey.com/board/topic/5 ... rowser-tab
Bekomms aber nicht hin. accChildCount liefert mir immer nur eine 1... obwohl 15 Tabs offen sind...
Ich frag mich auch, ob das überhaupt mit anderen Browsern funktionieren kann?

Kennt einer von euch ein eMethode einen Tab direkt zu identifieren und zu aktivieren? Also so das es für alle 3 Browser funktioniert?

Mein code Bisher:

Code: Select all

#SingleInstance force
OnMessage(0x201, "WM_LBUTTONDOWN")

HWNDIE:=0
HWNDCH:=0
HWNDFF:=0
BrowserError:=0

IEPfad:="C:\Program Files (x86)\Internet Explorer\iexplore.exe"
ChromePfad:="C:\Users\fump\Desktop\GoogleChromePortable\App\Chrome-bin\chrome.exe"
FireFoxPfad:="C:\Users\fump\Desktop\FirefoxPortable\Portable_Firefox_9.0\Firefox\firefox.exe"

UseLink:="www.google.de"

Menu, AAXcom, Add, Reload, ReloadAAXcom
Menu, AAXcom, Add, Schließen, CloseAAXcom
	
	
Gui, AAXcom:Font, S8 CBlack, Candara
Gui, AAXcom:Color, fff875
Gui, AAXcom:+AlwaysOnTop -caption +Border +ToolWindow +LastFound
Gui, AAXcom:Add, Text, x5 y2 w50 h14 Border Center vBrowser1 gBrowserChange HWNDh_IE, IE
Gui, AAXcom:Add, Text, x60 y2 w20 h14 Center, ID:
Gui, AAXcom:Add, Text, x80 y2 w40 h14 Center vID1, 
Gui, AAXcom:Add, Text, x125 y2 w50 h14 Border Center vBrowser2 gBrowserChange HWNDh_CH, Chrome
Gui, AAXcom:Add, Text, x180 y2 w20 h14 Center, ID:
Gui, AAXcom:Add, Text, x200 y2 w40 h14 Center vID2, 
Gui, AAXcom:Add, Text, x245 y2 w50 h14 Border Center vBrowser3 gBrowserChange HWNDh_FF, FireFox
Gui, AAXcom:Add, Text, x300 y2 w20 h14 Center, ID:
Gui, AAXcom:Add, Text, x320 y2 w40 h14 Center vID3, 
Gui, AAXcom:Show, x0 y0 h18 w365, New GUI Window
WinSet, Transparent, 220
Return

BrowserChange:
If (A_GuiControl="Browser1")
	{
		BrowserHWND:=HWNDIE
		Pfad:=IEPfad
		BrowserOption:=""
		BrowserWindowClass:="IEFrame"
		Detach1:=h_CH
		Detach2:=h_FF
		Attach:=h_IE
		GoSub OpenWindow
		If (BrowserError=1)
			{
				BrowserError:=0
				Return
			}
		else
			{
				BrowserInUse:="IE"
				HWNDIE:=BrowserHWND
				GuiControl, AAXcom:, ID1, %HWNDIE%
			}
		TabActivate(HWNDIE,Google)
	}
If (A_GuiControl="Browser2")
	{
		BrowserHWND:=HWNDCH
		Pfad:=ChromePfad
		BrowserOption:=""
		BrowserWindowClass:="Chrome_WidgetWin"
		Detach1:=h_IE
		Detach2:=h_FF
		Attach:=h_CH
		GoSub OpenWindow
		If (BrowserError=1)
			{
				BrowserError:=0
				Return
			}
		else
			{
				BrowserInUse:="CH"
				HWNDCH:=BrowserHWND
				GuiControl, AAXcom:, ID2, %HWNDCH%
			}
	}
If (A_GuiControl="Browser3")
	{
		BrowserHWND:=HWNDFF
		Pfad:=FireFoxPfad
		BrowserOption:="-new-window"
		BrowserWindowClass:="MozillaWindowClass"
		Detach1:=h_IE
		Detach2:=h_CH
		Attach:=h_FF
		GoSub OpenWindow
		If (BrowserError=1)
			{
				BrowserError:=0
				Return
			}
		else
			{
				BrowserInUse:="FF"
				HWNDFF:=BrowserHWND
				GuiControl, AAXcom:, ID3, %HWNDFF%
			}
	}
Return
	
OpenWindow:
IfWinNotExist, ahk_id %BrowserHWND%
	{
		Matchmode:=A_TitleMatchMode
		SetTitleMatchMode, RegEx
		Run,%Pfad% %BrowserOption% %UseLink%
		sleep, 1000
		WinWaitActive,ahk_class %BrowserWindowClass%
		WinWaitActive,aax2.tele2.compax.at||AAX² Release,,5
		if (Errorlevel=1)
			{
				SetTitleMatchMode, %Matchmode%
				msgbox, 4144, Fehler beim Browserstart, Leider konnnte der Browser innerhalb von 5 Sekunden nicht korrekt gestartet/erkannt werden. Bitte versuche es erneut.
				BrowserError:=1
				Return
			}
		else
			{
				SetTitleMatchMode, %Matchmode%
				WinGet, BrowserHWND , ID
				SetColor(Detach1,Detach2,Attach)
			}
	}
else
	{
		SetColor(Detach1,Detach2,Attach)
	}
Return

SetColor(Detach1,Detach2,Attach)
	{
		CTLCOLORS.Detach(Detach1)
		CTLCOLORS.Detach(Detach2)
		CTLCOLORS.Attach(Attach, "FFFFFF", "000000")
	}


AAXcomGuiContextMenu:
Menu, AAXcom, Show, %A_GuiX%, %A_GuiY%
Return

CloseAAXcom:
ExitApp

ReloadAAXcom:
OnExit,
Reload
Return

TabActivate(hwnd, tabName) { 
   ControlGet, hTabUI , hWnd,, DirectUIHWND5, ahk_id %hwnd%
   Acc := Acc_ObjectFromWindow(hTabUI) ;// access "Tabs" control
   msgbox % Acc.accChildCount
   If (Acc.accChildCount > 1) ;// more than 1 tab
      tabs := Acc.accChild(3) ;// access just "IE document tabs"
   While (tabs.accChildCount >= A_Index) {
      tab := tabs.accChild(A_Index)
      If (tab.accName(0) = tabName)  ;// test vs. "tabName"
         return tab.accDoDefaultAction(0) ;// invoke tab
   }
}

WM_LBUTTONDOWN()
{
	if (A_Gui="AAXcom")
		{
			If (A_GuiControl = "") ; Klick auf den Hintergrund der GUI
				PostMessage, 0xA1, 2, 0 ; sehr sehr alter Trick von SKAN: 0xA1 = WM_NCLBUTTONDOWN
		}
}

; Classe um Controls Farbig zu gestalten
#Include Class_CTLCOLORS.ahk

#Include Acc.ahk

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

Re: Browserfenster zu 100% Identifizieren

Post by fump2000 » 08 Nov 2013, 10:22

Mit diesem Code gehts im IE:

Code: Select all

TabActivate(TabName, WinTitle="") {
	ControlGet, hTabUI , hWnd,, DirectUIHWND5, % WinTitle=""? "ahk_class IEFrame":WinTitle
	Tabs := Acc_ObjectFromWindow(hTabUI).accChild(1) ; access "Tabs" control
	Loop, % Tabs.accChildCount
		if (Tabs.accChild(A_Index).accName(0) = TabName)
			return, Tabs.accChild(A_Index).accDoDefaultAction(0)
}
Chrome und FireFox liefern für die Tabs aber keine ClassNN. Gibts da trotzdem eine möglichkeit?

just me
Posts: 9576
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Browserfenster zu 100% Identifizieren

Post by just me » 08 Nov 2013, 10:40

Chrome, Firefox und tabbed IE scheinen zumindest identische Tastaturkürzel zu verwenden. Jetzt musst Du nur noch wissen, welchen Tab Du wählen willst.

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

Re: Browserfenster zu 100% Identifizieren

Post by fump2000 » 08 Nov 2013, 10:59

Sowas ist ja sehr leicht... anhand send den tab wechseln und dann entsprechend den Titel zu vergleichen. Ich dachte es ginge ne spur professioneller. Das mit dem ACC seihr sehr schön aus. Der IE geht auf und schwupp ist das Tab offen.

Anscheinend nur beim IE machbar... Schade...

just me
Posts: 9576
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Browserfenster zu 100% Identifizieren

Post by just me » 08 Nov 2013, 11:03

Ist schon möglich, dass es 'professionellere' Lösungen gibt. Ich fasse aber normalerweise die geheimnisvolle Welt der Browser nicht an und kenne sie nicht. ;)

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

Re: Browserfenster zu 100% Identifizieren

Post by fump2000 » 08 Nov 2013, 13:54

Ich bin leider nicht so sattelfest im Coden wie du es bist. Ich weiß nicht mal wie ich da anfangen müsste. Dieses ACC scheint ja zu können was ich suche jedenfalls für den IE. Ich frag mich halt ob man es nicht auch auf andere Browser portieren könnte.

Mein GoogleTranslate Englisch ist auch nicht so der hit :)

ruespe
Posts: 26
Joined: 09 Nov 2013, 04:47

Re: Browserfenster zu 100% Identifizieren

Post by ruespe » 09 Nov 2013, 05:23

Wie wär's, wenn du das Problem ganz anders angehen würdest? Du könntest ein eigenes Programm schreiben, in dem u.a. ein IE-Control mit eurem Tool enthalten ist. Das kann man dann auch mehrfach öffnen mit jeweils einer eigenen Instanz des IE.

Mit diesem (ablauffähige) Code kannst du das ja mal ausprobieren.

Code: Select all

Beginn:
	#SingleInstance off
	SetWorkingDir,%A_ScriptDir%
	SetTitleMatchMode, 2
	SetTitleMatchMode, slow
	SetMouseDelay,0
	DetectHiddenWindows, On
	SetControlDelay, 0 
@main: 
 { 
	 url:="http://www.google.de"
   Gosub,@init 
	 If (!IsObject(pwb))
		Return

    
   pwb.Navigate(url)
   loop 
    {
		  If !pwb.busy 
         break 
			Sleep 50
		}
		Random,__Temp,60,600
		__Temp *= 1000
   SetTimer,@terminate,-%__Temp%
 } 
return 

@init: 
{ 
   ;; housekeeping routines 
   ;; set the tear down procedure 
    
   ;; Create a gui 
   Gui,55: +LastFound +Resize +OwnDialogs 
    
   ;; get the gui handle 
   GuiHWND:= WinExist() 
    Gui,55:Add,Picture,x0 y0 w1010 h900 hwndGuiHWND  

   ;; create an instance of Internet Explorer_Server return the hwnd 
   ATLWinHWND := Atl_AxCreateContainer(GuiHWND,0,0,1010,900, "Shell.Explorer") 
    
   ;;get the iwebbrowser2 interface pointer 
   pwb := Atl_AxGetControl( ATLWinHWND ) 
    
   ;; disable annoying script errors from the page 
   pwb.silent := true 
    
    
   ;http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.ole.interop.ioleinplaceactiveobject(VS.80).aspx 
   IOleInPlaceActiveObject_Interface:="{00000117-0000-0000-C000-000000000046}" 
    
   ;; get the in place interface pointer 
   pipa := Query_Interface(pwb, IOleInPlaceActiveObject_Interface) 
    
   ;; capture key messages 
   ; OnMessage(WM_KEYDOWN:=0x0100, "WM_KEYDOWN") 
   ; OnMessage(WM_KEYUP:=0x0101, "WM_KEYDOWN") 
    
   ;;Display the GUI 
	 Gui,55:show
    
} 
   ;; return and allow the program 
return 


@terminate: 
{ 
   ;; housekeeping 
   ;; destroy the gui 
   Gui,55: Destroy 
} 
Return
Der Code ist übrigens nicht auf meinem Mist gewachsen. Ich weiss aber nicht mehr, woher ich ihn habe.

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

Re: Browserfenster zu 100% Identifizieren

Post by fump2000 » 09 Nov 2013, 08:25

Die idee ist gar nicht so schlecht... an dem Code musss man aber noch viel arbeiten...

Enter etc. wird nicht umgesetzt.

Die Libs hab ich finden können, gar nicht so einfach. Falls noch jemand testen will siehe unten :)
Über unterstützung würde ich mich freuen!

MfG
fump

Code: Select all

;------------------------------------------------------------------------------
; Atl.ahk Standard Library
; by Sean
;
; REQUIREMENT: 32/64-bit UNICODE AutoHotkey_L
;------------------------------------------------------------------------------

Atl_Init()
{
	Static	h
	If Not	h
		h:=DllCall("LoadLibrary","Str","atl","Ptr"), DllCall("atl\AtlAxWinInit")
}

Atl_AxGetHost(hWnd)
{
	Atl_Init()
	If	DllCall("atl\AtlAxGetHost", "Ptr", hWnd, "Ptr*", punk)=0
	Return	ComObjEnwrap(punk)
}

Atl_AxGetControl(hWnd)
{
	Atl_Init()
	If	DllCall("atl\AtlAxGetControl", "Ptr", hWnd, "Ptr*", punk)=0
	Return	ComObjEnwrap(punk)
}

Atl_AxAttachControl(punk, hWnd)
{
	Atl_Init()
	If	DllCall("atl\AtlAxAttachControl", "Ptr", IsObject(punk)?ComObjUnwrap(punk):punk, "Ptr", hWnd, "Ptr", 0)=0
	Return	IsObject(punk)?punk:ComObjEnwrap(punk)
}

Atl_AxCreateControl(hWnd, Name)
{
	Atl_Init()
	If	DllCall("atl\AtlAxCreateControlEx", "WStr", Name, "Ptr", hWnd, "Ptr", 0, "Ptr", 0, "Ptr*", punk, "Ptr", VarSetCapacity(GUID,16,0)*0+&GUID, "Ptr", 0)=0
	Return	ComObjEnwrap(punk)
}

Atl_AxCreateContainer(hWnd, l, t, w, h, Name = "", ExStyle = 0, Style = 0x54000000)
{
	Atl_Init()
	Return	DllCall("CreateWindowEx", "UInt", ExStyle, "Str", "AtlAxWin", "Str", Name, "UInt", Style, "Int", l, "Int", t, "Int", w, "Int", h, "Ptr", hWnd, "Ptr", 0, "Ptr", 0, "Ptr", 0, "Ptr")
}

Code: Select all

;------------------------------------------------------------------------------
; Query.ahk Standard Library
; by Sean
;
; REQUIREMENT: 32/64-bit UNICODE AutoHotkey_L
;------------------------------------------------------------------------------

Query_Service(pobj, SID, IID = "!", bRaw = "")
{
	If	DllCall(NumGet(NumGet(0,IsObject(pobj)?pobj:=ComObjUnwrap(pobj):pobj)), "Ptr", pobj, "Ptr", -VarSetCapacity(PID,16)+NumPut(0xFA096000AA003480,NumPut(0x11CE74366D5140C1,PID,"UInt64"),"UInt64"), "Ptr*", psp)=0
	&&	DllCall(NumGet(NumGet(0,psp),A_PtrSize*3), "Ptr", psp, "Ptr", Query_Guid4String(SID,SID), "Ptr", IID=="!"?&SID:Query_Guid4String(IID,IID), "Ptr*", pobj:=0)+DllCall(NumGet(NumGet(0,psp),A_PtrSize*2), "Ptr", psp)*0=0
	Return	bRaw?pobj:ComObjEnwrap(9,pobj)
}

Query_Interface(pobj, IID = "", bRaw = "")
{
	If	DllCall(NumGet(NumGet(0,IsObject(pobj)?pobj:=ComObjUnwrap(pobj):pobj)), "Ptr", pobj+0, "Ptr", Query_Guid4String(IID,IID), "Ptr*", pobj:=0)=0
	Return	bRaw?pobj:ComObjEnwrap(9,pobj)
}

Query_Guid4String(ByRef GUID, sz = "")
{
	Return	DllCall("ole32\CLSIDFromString", "WStr", sz?sz:sz==""?"{00020400-0000-0000-C000-000000000046}":"{00000000-0000-0000-C000-000000000046}", "Ptr", VarSetCapacity(GUID,16,0)*0+&GUID)*0+&GUID
}

Query_String4Guid(pGUID)
{
	Return	DllCall("ole32\StringFromGUID2", "Ptr", pGUID, "WStr", sz:="{00000000-0000-0000-0000-000000000000}", "Int", 39)?sz:""
}

just me
Posts: 9576
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Browserfenster zu 100% Identifizieren

Post by just me » 09 Nov 2013, 10:56

Ist das besser als ein ActiveX control?

Beispiel aus der Hilfe:

Code: Select all

#NoEnv
Gui Add, Edit, w930 r1 vURL, http://ahkscript.org/boards/
Gui Add, Button, x+6 yp w44, Go
Gui Add, ActiveX, xm w980 h640 vWB, Shell.Explorer
ComObjConnect(WB, WB_events)  ; Connect WB's events to the WB_events class object.
Gui Show

; Continue on to load the initial page:
ButtonGo:
Gui Submit, NoHide
WB.Navigate(URL)
Return

Class WB_events
{
    NavigateComplete2(wb, NewURL)
    {
        GuiControl,, URL, %NewURL%  ; Update the URL edit control.
    }
}

GuiClose:
ExitApp

Post Reply

Return to “Ich brauche Hilfe”