Ansicht:   

#311850

d-fens

Bonn,
23.05.2012, 11:53:39

Problem mit VBScript (pc.coding)

Hallo zusammen,

ich habe mir ein VBScript für folgendes Problem geschrieben: Nach manchen Spielen (DX9 oder älter) ist der Mauszeigerschatten deaktiviert, was ich nicht will. Also habe ich nach Möglichkeiten gesucht, den Schatten möglichst unkompliziert wieder aktivieren zu können - ohne Umweg über die Systemsteuerung.

Ich fand folgende Lösung:

Set ws = CreateObject(\"WScript.Shell\")
Call ws.regWrite(\"HKEY_CURRENT_USER\\Control Panel\\Desktop\\UserPreferencesMask\", &H80073E9E, \"REG_BINARY\")
ws.run(\"rundll32.exe user32.dll,UpdatePerUserSystemParameters\")

Dieses Script funktioniert auch, hat aber leider einen Schönheitsfehler, denn der Wert von UserPreferencesMask bei Windows 7 64bit ist &H0000001280073E9E, also ein QWord. Leider kann man mit regWrite nur maximal DWords schreiben. Also habe ich weiter recherchiert und ein Lösung mit einem Array gefunden:

Set ws = CreateObject(\"WScript.Shell\")
Const HKCU = &H80000001
KeyPath = \"Control Panel\\Desktop\"
Set oReg=GetObject(\"winmgmts:{impersonationLevel=impersonate}!\\\\\" & \".\\root\\default:StdRegProv\")
ValueName = \"UserPreferencesMask\"
iValues = Array(&H9E,&H3E,&H07,&H80,&H12,&H00,&H00,&H00)
oReg.SetBinaryValue HKCU,KeyPath,ValueName,iValues
ws.run(\"rundll32.exe user32.dll,UpdatePerUserSystemParameters\")

Das Setzen des Wertes funktioniert einwandfrei, das kann ich mit regedit.exe feststellen. Die Aktualisierung des Desktops funktioniert jedoch bei diesem zweiten Script offenbar nicht, d. h. der Schatten wird nicht angezeigt.

Hat jemand eine Ahnung, woran das liegen könnte oder vielleicht einen viel besseren Vorschlag für die Lösung des Problems?

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311854

effeff

Ostfriesland,
23.05.2012, 12:15:47

@ d-fens

Problem mit VBScript

Moin,

warum setzt du den von dir gewünschten Wert nicht per Hand und exportierst diese Einstellung als Reg-Datei, die du dann nach dem Spielen etc. wieder mit einem Doppelklick importieren kannst?  :kratz:

--
Gruß,

ff

Möge TUX mit dir sein!

#311857

d-fens

Bonn,
23.05.2012, 12:34:59

@ effeff

Problem mit VBScript

> Moin,
>
> warum setzt du den von dir gewünschten Wert nicht per Hand und exportierst
> diese Einstellung als Reg-Datei, die du dann nach dem Spielen etc. wieder
> mit einem Doppelklick importieren kannst?  :kratz:

Weil das Setzen des Wertes nicht das Problem darstellt. Der Desktop muss aktualisiert werden, damit der Schatten wieder angezeigt wird - dafür ist anschließend der dll-Aufruf notwendig.

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311859

Johann [Gast]

23.05.2012, 13:20:07

@ d-fens

Problem mit VBScript

Hallo,

> Weil das Setzen des Wertes nicht das Problem darstellt. Der Desktop muss
> aktualisiert werden, damit der Schatten wieder angezeigt wird - dafür ist
> anschließend der dll-Aufruf notwendig.

das geht doch auch aus einer Batch. REG Kommandos und danach \"rundll32 user32.dll,UpdatePerUserSystemParameters\" aufrufen? Beispiel

#311860

d-fens

Bonn,
23.05.2012, 14:13:23
(editiert von d-fens, 23.05.2012, 14:13:48)

@ Johann

Problem mit VBScript (ed)

> das geht doch auch aus einer Batch. REG Kommandos und danach \"rundll32
> user32.dll,UpdatePerUserSystemParameters\" aufrufen?
> Beispiel

Danke, aber mit REG ADD kriege ich leider keinen 64Bit-Wert geschrieben, genau wie mit dem regWrite-Befehl unter VB:


REG ADD \"HKCU\\Control Panel\\Desktop\" /v UserPreferencesMask /t REG_BINARY /d 9E3E078012000000

funktioniert leider nicht. Wahrscheinlich müsste ich zusätzlich den Umweg über eine .reg-Datei gehen. Mann, warum muss das so kompliziert sein?

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311861

Johann [Gast]

23.05.2012, 14:17:38
(editiert von Johann, 23.05.2012, 14:21:40)

@ d-fens

Problem mit VBScript (ed)

Ja eben, sagte effeff ja schon. Mach regdatei parat und ruf aus einer Batch erst die REG auf, respektive regedit mit der Datei, da musste mal gucken, und mach dann den DLL call. Das muss doch locker flockig klappen? Machen die ganzen warez Typen doch auch so...

#311862

d-fens

Bonn,
23.05.2012, 15:06:32

@ Johann

Problem mit VBScript

> Ja eben, sagte effeff ja schon. Mach regdatei parat und ruf aus einer Batch
> erst die REG auf, respektive regedit mit der Datei, da musste mal gucken,
> und mach dann den DLL call. Das muss doch locker flockig klappen? Machen
> die ganzen warez Typen doch auch so...

Klappt nicht zuverlässig. Der Wert wird zwar korrekt geändert, aber der Schatten wird nur manchmal wieder angezeigt. Batch-Datei:

@echo off
call :quiet>nul 2>&1
goto :EOF
:quiet
start /wait regedit /s upm.reg
:: Make the changes effective immediately
%SystemRoot%\\System32\\RUNDLL32.EXE user32.dll, UpdatePerUserSystemParameters


Und hier die \"upm.reg\":

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\\Control Panel\\Desktop]
\"UserPreferencesMask\"=hex:9e,3e,07,80,12,00,00,00


Ich habe auch schon eine Wartezeit vor dem DLL-Aufruf eingefügt - hilft nicht.

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311865

Johann [Gast]

23.05.2012, 16:07:39

@ d-fens

Problem mit VBScript

Jute Frage. Sicher, dass der neue Regwert gefressen wurde? Wie verhält es sich, wenn Du nur mal per Skript/Batch den Wert setzt und dann manuell mit F5 den Desktop refreshst?

#311866

d-fens

Bonn,
23.05.2012, 16:24:34

@ Johann

Problem mit VBScript

> Jute Frage. Sicher, dass der neue Regwert gefressen wurde?

Ja, das sehe ich ja mit regedit (GUI).

> Wie verhält es
> sich, wenn Du nur mal per Skript/Batch den Wert setzt und dann manuell mit
> F5 den Desktop refreshst?

Ändert nichts.

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311867

Johann [Gast]

23.05.2012, 16:59:46

@ d-fens

Problem mit VBScript

Dann ist das Problem aber offensichtlich, dass es bei der 64 Bit Version nicht so funktioniert, wie bei einer 32er, oder verstehe ich da was falsch?
Du hast ein funktionierendes Skript für ein 32er Windows und willst das nun auf einem 64er an\'s brennen kriegen?
Funktioniert denn der Reg-Wert überhaupt wie gedacht? Hast Du den mal über die GUI gesetzt und dann mal F5 probiert?
Kann ja sein, das weiss ich nicht, dass sich das 64er bei Regänderungen anders verhält, als das 32er. Vor allem, wenn es um\'s aktualisieren im laufenden Betrieb geht.

#311869

d-fens

Bonn,
23.05.2012, 17:27:38
(editiert von d-fens, 23.05.2012, 17:33:01)

@ Johann

Problem mit VBScript (ed)

> Dann ist das Problem aber offensichtlich, dass es bei der 64 Bit Version
> nicht so funktioniert, wie bei einer 32er, oder verstehe ich da was
> falsch?
> Du hast ein funktionierendes Skript für ein 32er Windows und willst das nun
> auf einem 64er an\'s brennen kriegen?
> Funktioniert denn der Reg-Wert überhaupt wie gedacht? Hast Du den mal über
> die GUI gesetzt und dann mal F5 probiert?
> Kann ja sein, das weiss ich nicht, dass sich das 64er bei Regänderungen
> anders verhält, als das 32er. Vor allem, wenn es um\'s aktualisieren im
> laufenden Betrieb geht.

F5 ist uninteressant. Es geht nicht um das Neuzeichnen des Desktops (da habe ich mich vorher falsch ausgedrückt), es geht um die Abbildung des folgenden Vorgangs:

-> Eigenschaften von Maus
-> Zeiger
-> Zeigerschatten aktivieren (Haken setzen/wegnehmen)
-> Übernehmen (oder OK)

Wenn ich das mache, wechselt der entsprechende Reg-Wert zwischen 9e,3e,07,80,12,00,00,00 (Schatten aktiviert) und 9e,1e,07,80,12,00,00,00 (Schatten deaktiviert). Das Setzen des Wertes per Script ist überhaupt nicht das Problem, nur das Applizieren der Änderungen (Klick auf OK/Übernehmen) funktioniert nicht zuverlässig.

EDIT:
Beschreibung des Wertes UserPreferencesMask

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311889

Johann [Gast]

24.05.2012, 10:01:05

@ d-fens

Problem mit VBScript

Morgen,

UpdatePerUserSystemParameters funktioniert im 64er W7 nicht mehr, guck mal

Gruß,
Johann

#311891

d-fens

Bonn,
24.05.2012, 10:06:45

@ Johann

Problem mit VBScript

> Morgen,
>
> UpdatePerUserSystemParameters funktioniert im 64er W7 nicht mehr,
> guck mal

Aha, danke. Wie ich weiter oben schon schrieb, funktioniert es manchmal doch noch. Aber das wird dann wohl Zufall sein. Nun gut, dann versuche ich es mal über die Win32-API. \"SPI_SETCURSORSHADOW\" sollte es wohl richten.

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311892

Johann [Gast]

24.05.2012, 10:20:13
(editiert von Johann, 24.05.2012, 10:22:47)

@ d-fens

Problem mit VBScript (ed)

> [...] funktioniert es manchmal [...]

Tja, sporadisch undefinierte Verhaltensweisen sind ja die schlimmsten die es gibt. Viel Erfolg  :-)
Die kommenden Tage droht Schönwetterkatastrophe, ich werde jetzt die Spiegel putzen  :uuuh:

#311897

Karsten Meyer zur Homepage von Karsten Meyer

Konstanz am Bodensee,
24.05.2012, 11:43:01

@ Johann

Problem mit VBScript

> Die kommenden Tage droht Schönwetterkatastrophe, ich werde jetzt die Spiegel putzen  :uuuh:

 :lol3:

--
Ich bin sehr aktiv bei facebook, wo ich vor allem Fotos zeige und mich in Gruppen über alles mögliche, insbesondere meine Heimatstadt Konstanz austausche.

#311901

d-fens

Bonn,
24.05.2012, 12:30:03

@ Johann

Problem mit VBScript

> > [...] funktioniert es manchmal [...]
>
> Tja, sporadisch undefinierte Verhaltensweisen sind ja die schlimmsten die
> es gibt. Viel Erfolg  :-)
> Die kommenden Tage droht
> Schönwetterkatastrophe,
> ich werde jetzt die Spiegel putzen  :uuuh:

Katastrophal.  ;-)

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311855

RuraPenthe

23.05.2012, 12:21:13

@ d-fens

Problem mit VBScript

den Schlüssel in eine externe Datei exportieren.

AM Desktop eine Verknüpfung erstellen mit folgender Befehlszeile

regedit.exe /s meinRegfile.reg

#311858

d-fens

Bonn,
23.05.2012, 12:35:20
(editiert von d-fens, 23.05.2012, 12:35:35)

@ RuraPenthe

Problem mit VBScript (ed)

Siehe meine Antwort an effeff.

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311863

RuraPenthe

23.05.2012, 15:52:46

@ d-fens

Problem mit VBScript


Const HKEY_CURRENT_USER = &H80000001
Set objRegistry = GetObject (\"winmgmts:\\\\.\\root\\default:StdRegProv\")
arrValues = Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)
errReturn = objRegistry.SetBinaryValue  (HKEY_CURRENT_USER, \"Software\", \"BinaryTest\", arrValues)

#311871

d-fens

Bonn,
23.05.2012, 17:31:52

@ RuraPenthe

Problem mit VBScript

>


> Const HKEY_CURRENT_USER = &H80000001
> Set objRegistry = GetObject (\"winmgmts:\\\\.\\root\\default:StdRegProv\")
> arrValues = Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)
> errReturn = objRegistry.SetBinaryValue  (HKEY_CURRENT_USER, \"Software\",
> \"BinaryTest\", arrValues)



Ich bin noch nicht sicher, wie mir das helfen könnte ...  :kratz:

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311883

RuraPenthe

24.05.2012, 08:03:08

@ d-fens

Problem mit VBScript

> >


> > Const HKEY_CURRENT_USER = &H80000001
> > Set objRegistry = GetObject (\"winmgmts:\\\\.\\root\\default:StdRegProv\")
> > arrValues = Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)
> > errReturn = objRegistry.SetBinaryValue  (HKEY_CURRENT_USER, \"Software\",
> > \"BinaryTest\", arrValues)


>
> Ich bin noch nicht sicher, wie mir das helfen könnte ...  :kratz:

das schreibt ein ByteArray (1,2,3......18) als REG_BINARY in die registry

-> HKEY_CURRENT_USER\\SOFTWARE\\BinaryTest= 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12

Ist doch genau was du wolltest, Natürlich auch deinen Schlüssel und dein ByteArray angepasst.

#311885

d-fens

Bonn,
24.05.2012, 08:45:50

@ RuraPenthe

Problem mit VBScript

> das schreibt ein ByteArray (1,2,3......18) als REG_BINARY in die registry
>
> -> HKEY_CURRENT_USER\\SOFTWARE\\BinaryTest= 01 02 03 04 05 06 07 08 09 0a 0b
> 0c 0d 0e 0f 10 11 12
>
> Ist doch genau was du wolltest, Natürlich auch deinen Schlüssel und dein
> ByteArray angepasst.

Das Schreiben des Wertes funktioniert in meinem Code. Nur das Sichtbarmachen der Änderungen nicht.

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311886

RuraPenthe

24.05.2012, 08:57:54
(editiert von RuraPenthe, 24.05.2012, 08:58:11)

@ d-fens

Problem mit VBScript (ed)

> Das Schreiben des Wertes funktioniert in meinem Code. Nur das
> Sichtbarmachen der Änderungen nicht.

das habe ich irgendweie überlesen.

Ja, stimmt UpdatePerUserSystemParameters funktioniert seit Vista x64 nicht mehr.

#311890

d-fens

Bonn,
24.05.2012, 10:02:45

@ RuraPenthe

Problem mit VBScript

> > Das Schreiben des Wertes funktioniert in meinem Code. Nur das
> > Sichtbarmachen der Änderungen nicht.
>
> das habe ich irgendweie überlesen.
>
> Ja, stimmt UpdatePerUserSystemParameters funktioniert seit Vista x64 nicht
> mehr.

Das Komische ist: Manchmal funktioniert es, manchmal nicht. Ich habe mal versucht, mit ProcMon herauszufinden, was bei Zeigerschatten-Aktivieren tatsächlich passiert, aber es schwierig, da zu filtern. UserPreferencesMask wird gelesen und verändert wieder geschrieben, soweit ist es klar, aber was noch durch Klick auf \"Übernehmen\" ausgelöst wird, kann ich nicht verfolgen.

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

#311896

effeff

Ostfriesland,
24.05.2012, 11:09:08

@ d-fens

Problem mit VBScript

Funktioniert eventuell das hier? Ich habe deinen Code um eine Zeile gekürzt und dann um zwei erweitert:


Set ws = CreateObject(\"WScript.Shell\")
Const HKCU = &H80000001
KeyPath = \"Control Panel\\Desktop\"
Set oReg=GetObject(\"winmgmts:{impersonationLevel=impersonate}!\\\\\" & \".\\root\\default:StdRegProv\")
ValueName = \"UserPreferencesMask\"
iValues = Array(&H9E,&H3E,&H07,&H80,&H12,&H00,&H00,&H00)
oReg.SetBinaryValue HKCU,KeyPath,ValueName,iValues

ws.AppActivate \"Program Manager\"
ws.SendKeys \"{F5}\"

--
Gruß,

ff

Möge TUX mit dir sein!

#311900

d-fens

Bonn,
24.05.2012, 12:29:17

@ effeff

Problem mit VBScript

> Funktioniert eventuell das hier? Ich habe deinen Code um eine Zeile gekürzt
> und dann um zwei erweitert:

Hab\'s mal probiert, danke. Aber wie ich erwartete, tut sich da gar nichts, auch nicht manchmal. F5 sorgt tatsächlich nur für das Neuzeichnen, aber nicht für das erneute Lesen der Werte aus der Registry.

--
„Tu es oder tu es nicht! Es gibt kein Versuchen.“
(Jedi-Meister Yoda)

Ansicht:   
Auf unserer Web-Seite werden Cookies eingesetzt, um diverse Funktionalitäten zu gewährleisten. Hier erfährst du alles zum Datenschutz