peterleb
Goto Top

Direktlink Google Bildersuche als Kontextmenü im Windows Explorer

Häufig suche ich bestimmte Bilder im Web mit besserer Auflösung oder einfach nur nach Herkunft oder Inhalt verschiedener Bilder. Meist bastle ich mir schöne Desktophintergründe für mein Dualscreen-System.
Bei der Suche muss ich immer erst die Google Bildersuche aufrufen, auf "Datei hochladen" gehen und dann das Bild auf dem PC auswählen.

Gibt es eine Möglichkeit, für den Windows Explorer ein Kontextmenü für Bilddateien zu konstruieren, welches dieses Vorgehen automatisiert?
So in etwa: "https://www.google.de/imghp" "Bild hochladen" %1.

Ich habe etwas von Google APIs gelesen, aber nichts zu Direktaufrufen der Bildersuche gefunden.

Schönen Sonntag noch.

Peter

Content-Key: 371244

Url: https://administrator.de/contentid/371244

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: Pedant
Pedant 15.04.2018 aktualisiert um 13:46:33 Uhr
Goto Top
Hallo Peter,

Zitat von @PeterleB:
Gibt es eine Möglichkeit, für den Windows Explorer ein Kontextmenü für Bilddateien zu konstruieren, welches dieses Vorgehen automatisiert?
So in etwa: "https://www.google.de/imghp" "Bild hochladen" %1.
Ein Bild, dass schon in Web ist, also eine URL hat, könntest Du so suchen lassen:
start https://www.google.de/searchbyimage?image_url=%1&image_content=&filename=&hl=de
Hier ein Beispiellink mit ersetzem %1:
https://www.google.de/searchbyimage?image_url=https://administrator.de/icons/members/profile_man_128x128.png&image_content=&filename=&hl=de
Dass statt der Url (http...bild.jpg) auf ähnlich einfache Weise eine lokale Datei (D:\...Bild.jpg) verwendet werden kann, möchte ich ausschließen.
Ich könnte mir als Lösung nur vorstellen, dass der lokale Pfad zum Bild an ein speziell geschriebenes Tool übergeben werden kann, dass in Browsermanier den Dateiinhalt ausliest und an Google sendet. Wobei dann zuvor geklärt werden müsste wohin der Datenstrom geschickt werden müsste.

Ein anderer Ansatz könnte ein Makro sein.
Eventuell kann man was mit Autohotkey basteln, dass man ins Kontextmenü aufnimmt.

Das Folgende gälte es dabei zu automatisieren:
1. start https://www.google.de/imghp
2. zum Kamera-Symbol springen und [Enter] oder auf Kamera-Symbol klicken
3. [Shift]+[Tab] damit "Bild hochladen" den Fokus erhält, dann [Enter]
4. [Tab] damit "Durchsuchen..." den Fokus erhält, dann [Enter]
5. lokalen Pfad (aus %1) ins Eingabefeld "Dateiname:" einfügen und [Enter]
Fertig

Schwierigkeiten sehe ich hier nur bei 2., also wie man per Tastatur zum Kamera-Symbol navigieren kann, habe ich nicht ermitteln können und per automatisiertem Klick, müsste man dessen Position kennen.
Wenn man den Browser maximiert und seine Bildschirmauflösung kennt, wäre die Position als x/y-Koordinaten zu ermitteln und wiederholbar verwendbar.
Schöner wäre es aber über eine Tastaturnavigation.

Zitat von @PeterleB:
Ich habe etwas von Google APIs gelesen, aber nichts zu Direktaufrufen der Bildersuche gefunden.
Hast Du den Link dazu?

Gruß Frank
Mitglied: Pedant
Pedant 15.04.2018 um 13:46:03 Uhr
Goto Top
Hallo selbst,

Zitat von @Pedant:
Schwierigkeiten sehe ich hier nur bei 2., also wie man per Tastatur zum Kamera-Symbol navigieren kann, habe ich nicht ermitteln können
So schwer war's dann doch nicht:
[Shift]+[Tab] springt vom Eingabefeld auf das Kamera-Symbol

Gruß an mich
Mitglied: PeterleB
PeterleB 15.04.2018 um 14:12:38 Uhr
Goto Top
Vielen Dank für die guten Ansätze.
Ich versuche mal, mich darin zu vertiefen.

Die Autohotkey-Sache klingt vielversprechend, gefällt mir aber nicht.

Kommt man nicht irgendwie legal an den (Javascript-)Code der Bildersuche ran?

Hier mal was zu API:
https://developers.google.com/image-search/
Mitglied: PeterleB
PeterleB 15.04.2018 um 14:24:03 Uhr
Goto Top
Mitglied: colinardo
Lösung colinardo 15.04.2018 aktualisiert um 16:47:09 Uhr
Goto Top
Servus Peter.
Ist es aber nicht. Es reicht hier das Bild via MultiPart-Form POST direkt eine spezielle Google URL zu schicken und die URL die per 302 Redirect zurück kommt im Browser aufzurufen. Das kannst du mit jeder Programmier und besseren Skriptsprache realisieren.

Nimmst du z.B. folgendes Powershell-Skript, das du dann folgendermaßen aufrufst
powershell -Executionpolicy Bypass -C "&'C:\Pfad\Script.ps1' 'D:\deinbild.jpg'"
Das öffnet dann automatisch deinen Browser mit dem Ergebnis.
param(
    [string]$file
)

function Get-GoogleImageSearchResult([string][ValidateScript({Test-Path $_})]$path){
    $boundary = [datetime]::now.Ticks.ToString()
    $p1 = @"  
--$boundary
Content-Disposition: form-data; name="encoded_image"; filename="$([IO.Path]::GetFileName($path))"  
Content-Type: image/$([System.IO.Path]::GetExtension($path).substring(1))


"@  
    $p2 = @"  
--$boundary
Content-Disposition: form-data; name="image_content"  


--$boundary--

"@  
    $bytes = [System.Text.Encoding]::ASCII.GetBytes($p1) + ([IO.File]::ReadAllBytes($path)) + [System.Text.Encoding]::ASCII.GetBytes($p2)
    $request = [Net.HttpWebRequest] ([Net.HttpWebRequest]::Create('https://images.google.com/searchbyimage/upload'))  
    $request.Method = "POST"  
    $request.ContentType = "multipart/form-data; boundary=$boundary"  
    $request.ContentLength = $bytes.Length
    $request.AllowAutoredirect = $false
    $stream = $request.GetRequestStream()
    $stream.Write($bytes, 0, $bytes.Length)
    $stream.Close()
    return [regex]::match((New-Object Io.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd(),'(?is)HREF="([^"]+)"').Groups[1].Value  
}

$url = Get-GoogleImageSearchResult $file
if ($url){start $url}
Oder wenn du Python magst, das geht auch wenn man das 'requests' Modul nachinstalliert:
import sys
import requests
filePath = sys.argv[-1]

sUrl = 'https://www.google.com/searchbyimage/upload'  
parts = {'encoded_image': (filePath, open(filePath, 'rb')), 'image_content': ''}  
response = requests.post(sUrl, files=parts, allow_redirects=False)
url = response.headers['Location']  
print(url)
(Zeigt dir in Beispiel nur die URL an).

Viel Spaß
Grüße Uwe
Mitglied: Pedant
Lösung Pedant 15.04.2018 aktualisiert um 16:03:00 Uhr
Goto Top
Hallo Peter,

Zitat von @PeterleB:
Die Autohotkey-Sache klingt vielversprechend, gefällt mir aber nicht.

Mir gefällt's und ich hab's testweise zum Laufen gebracht.

Autohotkey habe ich als zip runtergeladen, dann läuft's auch ohne Installation.
Ausgepackt hab ich's nach "C:\Program Files (x86)\Tools\AutoHotkey\"
Die geschriebene Makrodatei habe ich auch dort abgelegt, sie könnte aber auch woanders abgelegt werden.
Genannt habe ich die "Bildersuche.ahk".

Um Autohotkey etwas als Parameter (zusätzlich zum Skript) mitzugeben ist die Syntax so:
AutoHotkeyU64.exe Skriptdatei.ahk "Bla Bla"
Im übergebenen Skript kann man auf den Parameter (Bla Bla) per %1% zugreifen.

Bildersuche.ahk
Run, https://www.google.de/imghp
WinWaitActive Google Bilder
Sleep 1000
Send +{Tab}
Sleep 100
Send {Enter}
Sleep 100
Send +{Tab}
Sleep 100
Send {Enter}
Sleep 100
Send {Tab}
Sleep 100
Send {Tab}
Sleep 100
Send {Enter}
Sleep 100
;Send, D:\Meine Bilder\Testbild.jpg
Send, %1%
Sleep 100

; Das letze Enter ist vorläufig noch auskommentiert,
; damit man in der Testphase noch lesen kann, was automatisch eingetragen wurde.
;Send {Enter}

Der Aufruf aus der Kommandozeile sähe dann so aus:
"C:\Program Files (x86)\Tools\AutoHotkey\AutoHotkeyU64.exe" "C:\Program Files (x86)\Tools\AutoHotkey\Bildersuche.ahk" "D:\Meine Bilder\Testbild.jpg"  


Um den Aufruf ins Kontextmenü zu bekommen ist eine Sache etwas merkwürdig:
Man muss es scheinbar nicht dem Dateityp unterschieben:
[HKEY_CLASSES_ROOT\jpegfile\shell\Bildersuche\command]
@="\"C:\\Program Files (x86)\\Tools\\AutoHotkey\\AutoHotkeyU64.exe\" \"C:\\Program Files (x86)\\Tools\\AutoHotkey\\Bildersuche.ahk\" \"%1\""  
Das wird ignoriert und ist daher nutzlos,

sondern der Anwendung, mit der der Dateityp verknüpft ist.
[HKEY_CLASSES_ROOT\Applications\Mein-Bildbetrachter.exe\shell\Bildersuche\command]
@="\"C:\\Program Files (x86)\\Tools\\AutoHotkey\\AutoHotkeyU64.exe\" \"C:\\Program Files (x86)\\Tools\\AutoHotkey\\Bildersuche.ahk\" \"%1\""  
Das ist zwar etwas unintuitiv, hat aber den Vorteil, dass es sich auf alle verknüpften Dateitypen auswirkt, aber auch den Nachteil, dass es nicht mehr funktioniert, wenn man dem Dateityp eine andere Anwendung zuordnet.

Man könnte es auch pauschal allen Dateitypen unterschieben
[HKEY_CLASSES_ROOT\*\shell\Bildersuche\command]
@="\"C:\\Program Files (x86)\\Tools\\AutoHotkey\\AutoHotkeyU64.exe\" \"C:\\Program Files (x86)\\Tools\\AutoHotkey\\Bildersuche.ahk\" \"%1\""  
aber das wäre hier denkbar unelegant.
Wer will schon sein Sterererklärung.doc in die Bildersuche hochladen.

Wenn Du "Mein-Bildbetrachter.exe" und falls nötig ein paar Pfade anpasst, kannst Du's gerne benutzen.

Gruß Frank

PS:
Mit der API beschäftige ich mich - zumindest heute - nicht, aber danke für den Link.
Mitglied: Pedant
Lösung Pedant 15.04.2018 um 16:11:39 Uhr
Goto Top
Hallo Uwe,

Zitat von @colinardo:
powershell -Executionpolicy Bypass -C "&'C:\Pfad\Script.ps1' 'D:\deinbild.jpg'"
...funktioniert wie immer einwandfrei.
Mein Makro schmier' ich mir dann in die Haare.

Gruß Frank
Mitglied: PeterleB
PeterleB 15.04.2018 um 16:40:26 Uhr
Goto Top
Das ist der Hammer!
Ich danke Euch wie verrückt.

Gruß Peter
Mitglied: colinardo
colinardo 15.04.2018 aktualisiert um 17:40:08 Uhr
Goto Top
Noch zur Info für all die, die das mit anderen Sprachen realisieren möchten. Es gibt hier eine fiese Falle/Bug welche mich beim Implementieren einige Zeit gekostet hat. Und zwar betrifft das den Content-Type- Header und das boundary Feld. Laut RFC darf dieses Feld durchaus mit Anführungszeichen (") umgeben sein.
Content-Type: multipart/form-data; boundary="123456789"
Es gibt aber einige Implementierungen die eben diesen Fakt nicht richtig interpretieren. Microsoft hat es korrekt nach RFC implementiert, aber die Gegenseite bei Google kommt damit nicht klar, dort dürfen beim Request keine Anführungszeichen im Header-Feld übermittelt werden, ansonsten gibt Google eine falsche URL zurück!!
Content-Type: multipart/form-data; boundary=123456789
Wenn man also mit .NET und HttpClient oder Invoke-Webrequest arbeiten wollte geht das auf den ersten Versuch hin deshalb nicht, deswegen die Umsetzung über einen RAW HttpWebRequest.

Grüße Uwe
Mitglied: PeterleB
PeterleB 15.04.2018 um 17:57:31 Uhr
Goto Top
Also, ich bin begeistert!
Das klappt wirklich.

Könnte man das PowerShell-Fenster ganz ausblenden und dafür eine MsgBox "Suche gestartet" anzeigen?
(Vielleicht schaffe ich das sogar selbst.)

Nochmal vielen Dank.

Gruß Peter
Mitglied: PeterleB
PeterleB 15.04.2018 um 18:08:21 Uhr
Goto Top
Habe noch einen anderen Key gefunden, der funktioniert:
HKEY_CLASSES_ROOT\SystemFileAssociations\image\Shell

Gruß Peter
Mitglied: PeterleB
PeterleB 15.04.2018 aktualisiert um 18:22:23 Uhr
Goto Top
Dachte ich...

mit

powershell.exe -Executionpolicy Bypass -C "&'C:\Scripts\GoogleImgSearch.ps1' %1"

wird das Kontextmenü angezeigt, die PowerShell startet und schließt sich, dann passiert nichts mehr.
Als Direktaufruf hat es so schön funktioniert.

Gruß Peter
Mitglied: colinardo
Lösung colinardo 15.04.2018 aktualisiert um 18:49:10 Uhr
Goto Top
Zitat von @PeterleB:
Powershell.exe -Executionpolicy Bypass -C "&'C:\Scripts\GoogleImgSearch.ps1' %1"

wird das Kontextmenü angezeigt, die PowerShell startet und schließt sich, dann passiert nichts mehr.
Als Direktaufruf hat es so schön funktioniert.
Das %1 gehört in Hochkommata, da ansonsten Leerzeichen im Pfad zu einer Parametertrennung führen!
Powershell.exe -Executionpolicy Bypass -C "&'C:\Scripts\GoogleImgSearch.ps1' '%1'"  
Hättest du oben mal besser hingesehen face-smile.

Könnte man das PowerShell-Fenster ganz ausblenden und dafür eine MsgBox "Suche gestartet" anzeigen?
Kann man, entweder den Parameter -Windowstyle Hidden nutzen oder das Skript via VBS starten, oder via .NET Function ausblenden, du hast viele Möglichkeiten.
(Vielleicht schaffe ich das sogar selbst.)
Oder einfach mal die Suche hier anwerfen, das hab ich hier schon bis zum Abwinken gepostet.
Ich nehm dir jetzt mal nicht den Forscherdrang weg, du schaffst das! Ist ja Sonntag.

Habe noch einen anderen Key gefunden, der funktioniert:
HKEY_CLASSES_ROOT\SystemFileAssociations\image\Shell
Oder auch einfach Verknüpfung ins Sendto legen.

p.s. Powershell-Grundlagen gehören hier nicht schon wieder hin, die sollten doch mittlerweile Standard sein. Merci!
Mitglied: PeterleB
PeterleB 15.04.2018 um 19:15:12 Uhr
Goto Top
Danke, Danke, Danke

Gruß Peter


PS: Wie geht das mit der Code-Zeile?
Wenn ich hier links auf "Codeblock" drücke, sehe ich dann nur die HTML-Anweisung.
Mitglied: colinardo
Lösung colinardo 15.04.2018 aktualisiert um 19:36:14 Uhr
Goto Top
Keine Ursache.
Zitat von @PeterleB:
PS: Wie geht das mit der Code-Zeile?
Wenn ich hier links auf "Codeblock" drücke, sehe ich dann nur die HTML-Anweisung.
Das ist normal wenn du deinen Text bearbeitest, kopiere deinen Quelltext zwischen die Tags und wenn du auf Vorschau klickst siehst du wie es aussieht ...
Hier nachzulesen
Formatierungen in den Beiträgen
Mitglied: PeterleB
PeterleB 16.04.2018 aktualisiert um 07:02:41 Uhr
Goto Top
Also zu Hause klappt das alles wunderbar.
Aber auf Arbeit bekomme ich einen Fehler (fast erwartet):

Ausnahme beim Aufrufen von "GetRequestStream" mit 0 Argument(en):
"Der Remoteserver hat einen Fehler zurückgegeben: (407) Proxyauthentifizierung erforderlich."
In C:\Scripts\GoogleImgSearch.ps1:28 Zeichen:5
$stream = $request.GetRequestStream()

Hab' schon ein bisschen gegoogelt, muss halt der PowerShell irgendwie den Systemproxy mit Authentifizierung übergeben.

Gruß Peter
Mitglied: colinardo
colinardo 16.04.2018 aktualisiert um 07:27:32 Uhr
Goto Top
Pillepalle, einfach dem Webrequest die Creds über ein Proxy Objekt übergeben
https://stackoverflow.com/questions/9603093/proxy-basic-authentication-i ...
Mitglied: PeterleB
PeterleB 16.04.2018 aktualisiert um 07:36:38 Uhr
Goto Top
Schon was gefunden:

$Wcl=New-Object System.Net.WebClient
$Creds=Get-Credential
$Wcl.Proxy.Credentials=$Creds

Jetzt muss ich noch User/PW übergeben,
und eine Abfrage, ob ein Proxy vorgeschaltet ist.

Gruß Peter
Mitglied: colinardo
colinardo 16.04.2018 aktualisiert um 07:35:06 Uhr
Goto Top
Nein, den Webclient kannst du nicht nehmen, der hat oben genannte Schwachstelle mit den Google Servern! Siehe Link, dem Httpwebrequest kannst du genauso ein Proxy Object mit Creds übergeben, also mach das auch.
Nicht suchen, sondern Kopf benutzen.

Btw. langsam am Thema vorbei.
Mitglied: PeterleB
PeterleB 16.04.2018 um 07:43:53 Uhr
Goto Top
Ich werde das beherzigen.
Und bitte Nachsicht, bin nur Mediziner und kein studierter Informatiker.

Muss jetzt meinem Job nachgehen.

Schönen Tag
Peter
Mitglied: colinardo
colinardo 16.04.2018 aktualisiert um 12:10:21 Uhr
Goto Top
Proxy für Webrequest verwenden:
Das hier zwischen Zeile 24 und 25 einfügen:
$proxy = [System.Net.WebProxy]::GetDefaultProxy()
$proxy.UseDefaultCredentials = $true
$request.Proxy = $proxy
Schönen Tag
Peter
Gleichfalls.
Mitglied: Pedant
Pedant 16.04.2018 um 13:22:33 Uhr
Goto Top
Hallo Peter,

Zitat von @PeterleB:
Habe noch einen anderen Key gefunden, der funktioniert:
HKEY_CLASSES_ROOT\SystemFileAssociations\image\Shell

Danke, der ist besser als die von mir aufgeführten.

Gruß Frank
Mitglied: PeterleB
PeterleB 16.04.2018 um 15:17:11 Uhr
Goto Top
Leider findet PS den DefaultProxy nicht.

Gruß Peter
Mitglied: colinardo
colinardo 16.04.2018 aktualisiert um 16:13:33 Uhr
Goto Top
Dann gib ihn in den Eigenschaften stattdessen einfach an. Die Intellisense ist dein Freund und zeigt dir welche Eigenschaften das Objekt hat face-smile! Also mal ehrlich, als Mediziner weist du doch auch wo du nachschlagen musst wenn du etwas nicht weist, oder?
Mitglied: PeterleB
PeterleB 16.04.2018 um 16:16:24 Uhr
Goto Top
Danke für die Hinweise.
Kann erst morgen auf der Arbeit (in einer Pause) weitermachen.
Mitglied: PeterleB
PeterleB 17.04.2018 um 08:07:06 Uhr
Goto Top
Hatte heute früh noch etwas Zeit.
Das Ergebnis sieht so aus und funktioniert.

    $proxyenabled = Get-ItemProperty -Path "Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"  
    #if proxy
    if($proxyenabled.ProxyEnable = 1) { 
        # Standardanmeldedaten ...
        ## $proxy = [System.Net.WebProxy]::GetDefaultProxy()
        ## $proxy.UseDefaultCredentials = $true
        # ...oder nach Anmeldedaten fragen
        ## $proxy.Credentials = (Get-Credential).GetNetworkCredential()
        # ...oder Anmeldedaten übergeben
        $proxy = New-Object System.Net.WebProxy("http://xxx.xxx.xxx.xx:80")  
        $creds = New-object System.Net.NetworkCredential("user","passwort")  
        $proxy.Credentials = $creds
        $request.Proxy = $proxy
        }
    #endif proxy

Jetzt muss noch das PowerShell-Fenster weg und eine Meldung, dass was passiert.

Gruß Peter
Mitglied: colinardo
colinardo 17.04.2018 aktualisiert um 10:41:31 Uhr
Goto Top
Jetzt muss noch das PowerShell-Fenster weg und eine Meldung, dass was passiert.
Hatte ich dir oben schon die passenden Hinweise dafür gegeben! Wenn du es ganz weg haben willst starte es über ein VBS Script, -WindowStyle Hidden lässt es zwar verschwinden es blitzt aber noch kurz auf. Alternativ kompilier es zu einer Exe.

Lösung über VBS, erstelle dir folgendes VBS:
If MsgBox ("Datei '" & WScript.Arguments(0) & "' jetzt zu Google hochladen.", vbInformation Or vbYesNo) = vbYes Then  
	CreateObject("Wscript.Shell").Run("powershell -NoProfile -Executionpolicy Bypass -C ""&'C:\Pfad\script.ps1' '" & WScript.Arguments(0)& "'"""),0,False  
End If
passe den Pfad zum Script an. Und dann startest du das VBS folgendermaßen über die Registry:
wscript //NOLOGO "C:\pfad\script.vbs" "%1"

if($proxyenabled.ProxyEnable = 1) {
Das funktioniert nicht!! Das Gleichheitszeichen ist ein Zuweisungsoperator und kein Vergleichsoperator. Zum Vergleichen nutzt du -eq!

Grüße Uwe
Mitglied: PeterleB
PeterleB 17.04.2018 aktualisiert um 11:12:24 Uhr
Goto Top
Oh, Danke.
if($proxyenabled.ProxyEnable -eq 1) {

Lieber wäre mir eine MsgBox ohne Benutzereingabe, die sich bei Öffnen des Browserfensters selbst schließt.
Aber ich kann ja auch suchen...

Gruß Peter
Mitglied: colinardo
Lösung colinardo 17.04.2018, aktualisiert am 23.06.2023 um 12:33:56 Uhr
Goto Top
Zitat von @PeterleB:
Lieber wäre mir eine MsgBox ohne Benutzereingabe, die sich bei Öffnen des Browserfensters selbst schließt.

Auch noch Sonderwünsche face-wink...

Powershell kann Windows-Forms oder WPF in allen Spielarten da kannst du machen was du willst:
param(
    [string]$file
)

[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  

function Get-GoogleImageSearchResult([string][ValidateScript({Test-Path $_})]$path){
    $boundary = [datetime]::now.Ticks.ToString()
    $p1 = @"  
--$boundary
Content-Disposition: form-data; name="encoded_image"; filename="$([IO.Path]::GetFileName($path))"  
Content-Type: image/$([System.IO.Path]::GetExtension($path).substring(1))


"@  
    $p2 = @"  
--$boundary
Content-Disposition: form-data; name="image_content"  


--$boundary--

"@  
    $bytes = [System.Text.Encoding]::ASCII.GetBytes($p1) + ([IO.File]::ReadAllBytes($path)) + [System.Text.Encoding]::ASCII.GetBytes($p2)
    $request = [Net.HttpWebRequest] ([Net.HttpWebRequest]::Create('https://images.google.com/searchbyimage/upload'))  
    $request.Method = "POST"  
    $request.ContentType = "multipart/form-data; boundary=$boundary"  
    $request.ContentLength = $bytes.Length
    $request.AllowAutoredirect = $false
    $stream = $request.GetRequestStream()
    $stream.Write($bytes, 0, $bytes.Length)
    $stream.Close()
    return [regex]::match((New-Object Io.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd(),'(?is)HREF="([^"]+)"').Groups[1].Value  
}

function ShowForm(){
    $form1 = New-Object System.Windows.Forms.Form
    $lblStatus = New-Object System.Windows.Forms.Label
    $form1.ClientSize = [System.Drawing.Size]::new(292,62)
    $form1.ControlBox = $False
    $form1.StartPosition = 1
    $form1.FormBorderStyle = 5
    $form1.Name = "form1"  
    $form1.Text = "Uploading ..."  
    $form1.add_Shown({
        $form1.Update()
        $url = Get-GoogleImageSearchResult $file
        if ($url){
            start $url
        }
        $form1.Close()
    })

    $lblStatus.Dock = 5
    $lblStatus.Font = New-Object System.Drawing.Font("Arial",13,1,3,0)  
    $lblStatus.Location = [System.Drawing.Point]::new(0,0)
    $lblStatus.Name = "lblStatus"  
    $lblStatus.Size = [System.Drawing.Size]::new(292,62)
    $lblStatus.Visible = $true
    $lblStatus.Text = "Uploading file, please wait."  
    $lblStatus.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
    $form1.Controls.Add($lblStatus)
    $form1.ShowDialog() | out-null
}
ShowForm
Dein Proxycode kannst du ja selbst einfügen.
Mitglied: PeterleB
PeterleB 17.04.2018 um 13:09:48 Uhr
Goto Top
Das haut mich um (Dein Fleiß und Wissen)
Danke.
Mitglied: PeterleB
PeterleB 17.04.2018 um 16:36:04 Uhr
Goto Top
Es funktioniert wunderbar.

Habe dem Registry-Aufruf noch "-WindowStyle Hidden " hinzugefügt.
Das kurze Aufflackern der Console stört mich nicht.

Nochmals Danke
Gruß Peter
Mitglied: Pedant
Pedant 17.04.2018 um 18:30:33 Uhr
Goto Top
Hallo Peter,

Zitat von @PeterleB:
Habe dem Registry-Aufruf noch "-WindowStyle Hidden " hinzugefügt.
...dann siehst Du aber auch die schicke Sonderwunsch-MsgBox-ohne-Benutzereingabe nicht.

Zitat von @PeterleB:
Das kurze Aufflackern der Console stört mich nicht.
...falls doch, dann nutz colinardos vb-Skript.
Das if und die Rückfrage kannst Du ja weglassen, wenn Du beides nicht brauchst.
Es bliebe dann nur dieser Einzeiler übrig:
CreateObject("Wscript.Shell").Run("powershell -NoProfile -Executionpolicy Bypass -C ""&'C:\Pfad\script.ps1'
und für die Registy hieße es dann, wie colinardos schrieb:
wscript //NOLOGO "C:\pfad\script.vbs" "%1"

Gruß Frank
Mitglied: PeterleB
PeterleB 17.04.2018 aktualisiert um 20:22:47 Uhr
Goto Top
Die MsgBox sehe ich trotzdem.
Die wscript-Sache probiere ich.
(Fehlt eine Klammer ganz hinten, nicht wahr?)

Gruß Peter.
Mitglied: PeterleB
PeterleB 17.04.2018 aktualisiert um 20:42:41 Uhr
Goto Top
Habe nochmal nach der CreateObject-Zeile geschaut, weiter oben ist sie vollständig.
CreateObject("Wscript.Shell").Run("powershell -NoProfile -Executionpolicy Bypass -C ""&'C:\Scripts\GoogleImgSearch.ps1' '" & WScript.Arguments(0)& "'"""),0,False  
Jetzt ist die PowerShell tatsächlich weg, aber ich sehe auch keine MsgBox mehr!
Mitglied: colinardo
colinardo 17.04.2018 aktualisiert um 21:27:19 Uhr
Goto Top
Zitat von @PeterleB:

Die MsgBox sehe ich trotzdem.
Das ist keine Msgbox im Powershell-Skript, das ist eine ausgewachsene Windows Form und diese wird vom WindowStyle Parameter nicht beeinflusst weil der nur die Sichtbarkeit der Konsole und nicht des ganzen Prozesses festlegt.
Im Gegensatz dazu macht das VBS den ganzen Powershell-Thread unsichtbar inkl. abhängig gestarteter Forms.

Also entweder Message im VBS zeigen oder im Powershell-Skript. Man kann aber auch per Win32 die Konsole verstecken, also das WindowStyle Hidden quasi mit eigenem Code im PS Script anstoßen aber das kannst du zu Genüge in diversen meiner Beiträge nachlesen falls es dich interessiert. face-smile.
Siehe als bsp. Powershell Logon Script - Ausgabe anzeigen

So jetzt haben wird das ganze aber bis zum Abwinken abgehandelt, das sollte eigentlich reichen für weitere eigene Experimente.

p.s. Herzlichen Dank für deine Spende face-wink.
Mitglied: PeterleB
PeterleB 11.05.2018 aktualisiert um 13:28:44 Uhr
Goto Top
Lieber colinardo

Ist es zu vermessen, um den Code in C++ für Visual Studio Community 2017 zu bitten?
Ich bastle da an einer DLL fürs Kontextmenü.
Das Gerüst funktioniert schon.

Gruß Peter