Link to home
Start Free TrialLog in
Avatar of zipnotic
zipnoticFlag for United States of America

asked on

Reading and Writing Registry Key in 64 bit or 32 bit OS to force webbrowser control to IE9

Hello,

Google maps recently forced the site to use greater than IE7 standards making the webbrowser control (WB) not work with their website.  The best solution seems to be modifying the registry to force the WB to use IE9 or 10 standards.  I'm trying to modify my code so that the user machine on all profiles will use the IE 9 standard.  I'd like to check if the following registry value is present and add it if it isn't in both 32 bit and 64 bit systems.  I'm having trouble however and the junk code is my attempts so far.

Value to be added to wow64 OR 32 bit registry:

32 bit:


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

Value Key: yourapplication.exe
Type: Reg_DWORD
Value: 9999 (decimal)

64 bit:


HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

Value Key: yourapplication.exe
Type: Reg_DWORD
Value: 9999 (decimal)

as suggested by this nice person:

http://www.west-wind.com/weblog/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version

Thanks for any help you can give




 Try

            Dim RK As RegistryKey = RegistryKey.openbasekey(RegistryHive.LocalMachine, registryview.registry64)


            Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", True)
            Dim val As String()
            val = key.GetValueNames()
            key.SetValue("MYPROGRAM.EXE", "9999", RegistryValueKind.[String])
            key.Close()


            '  HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

            ' [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]"YOURPROGRAM.EXE"=dword:00002328
            'If Microsoft.Win32.Registry.LocalMachine.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION") Is Nothing Then
            '    ' Key doesn't exist
            '    MsgBox("Key doesn't exist")
            '    Microsoft.Win32.Registry.LocalMachine.CreateSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION")
            '    Microsoft.Win32.Registry.LocalMachine.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", "9999")
            'Else
            '    ' Key existed
            'End If
        Catch ex As Exception

        End Try

Open in new window

Avatar of zipnotic
zipnotic
Flag of United States of America image

ASKER

Still trying to figure this out.  Any help would be appreciated.  

If it means anything, VS 2010 is set to compile to x86.  It doesn't give me any other option.


Also tried the simpler

            '  My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", "TestValue", "This is a test value.")

but it resulted in a null object exception

Having a bit more success with:

            Registry.LocalMachine.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", "TestValue", RegistryValueKind.String)

 ' RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.WriteKey)

But that gives me permission denied exception (that's the closest I came so far to adding the key I need to).

The following only gives me "nothing" in the instances....




 Try

            Dim instance As RegistryKey = Registry.CurrentUser.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.WriteKey)
            Dim instance2 As RegistryKey = Registry.CurrentUser.OpenSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.WriteKey)
            Dim instance3 As RegistryKey = Registry.LocalMachine.CreateSubKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree)
            Dim name As String
            Dim value As Object
            Dim valueKind As RegistryValueKind

            name = "NEW TEST SUBKEY.EXE"
            value = "9999"
            valueKind = RegistryValueKind.DWord


            instance.SetValue(name, value, valueKind)

Open in new window

I'm reading about permissions in Windows 7, is that the problem when writing to Local Machine?  Something about adding something to the manifest?
Avatar of Bob Learned
Yes, Windows 7 security limits access by default, unless you elevate privileges to administrator level.

Create and Embed an Application Manifest (UAC)
http://msdn.microsoft.com/en-us/library/bb756929.aspx
Looks like I have some reading to do.

Can you advise the best practice code (even just aircode) to ultimately write the following to the registry when the target machine may be

32 or 64
Win 7 or Win XP or Win 8
Users have no admin rights


HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)
   SOFTWARE
      Microsoft
         Internet Explorer
            Main
               FeatureControl
                  FEATURE_BROWSER_EMULATION
                     MYAPPLICATIONNAME.exe = (DWORD) 00009000
SOLUTION
Avatar of Bob Learned
Bob Learned
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
to add to above comments:

if HKEY_CURRENT_USER would be an alternative, you should do it with that.

alternatively, you may think of a setup for your program that runs in admin mode and writes the entry to the registry.

Sara
So far, writing to the CURRENT_USER seems cleaner.  From what I understand the "registry director" will send the following entry to the right node automatically?  I tried it on a win 7 64 bit machine and an XP 32 bit machine and so far so good but will there be any deployment problems I should anticipate?  If not then this 'workaround' solution is a lot easier then I made it out to be...

The SetValue does nothing if the entry is already there, this is good.
The process is seamless to the user, this is good.
The webbrowser behaves, this is good.
The project is compiled for x86 while anyCPU breaks it, this is not so good, but tolerable.

Try
            Dim instance3 As RegistryKey = Registry.CurrentUser.CreateSubKey("SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree)
            instance3.SetValue(Application.ExecutablePath.ToString(), 9999, RegistryValueKind.DWord)
            instance3.SetValue("IconicResolution.vshost.exe", 9999, RegistryValueKind.DWord) 'TODO Remove this line
            instance3.Close()
Catch ex as exception
End Try
ASKER CERTIFIED SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thank you both.  Learned's would probably work but Sara's is quicker and direct.