package require registry package require BWidget 1.3 namespace eval regb { variable BaseKeys { HKEY_CLASSES_ROOT HKEY_LOCAL_MACHINE HKEY_CURRENT_USER } variable PROGINC -1 variable PROGTXT "" } proc regb::build_screen {w} { variable BaseKeys if {$w ne ""} {toplevel $w} NoteBook $w.nb -internalborderwidth 0 foreach k $BaseKeys { build_tree_tab $w.nb $k } build_info_tab $w.nb $w.nb compute_size pack $w.nb -fill both -expand yes $w.nb raise [$w.nb pages end] if {$w eq ""} {set w .; wm deic $w} wm title $w Registrar wm geometry $w 240x268 catch {wce siphide} } proc regb::build_info_tab {nb} { set f [$nb insert end help -text ?] text $f.t $f.t tag config HEAD -font {Tahoma 9 bold} pack $f.t $f.t insert end "\nSimple Registry Browser" HEAD $f.t insert end "\n Each Tab is a separate HKEY section of Registry Selecting a key on the left side shows all values under that key\n\n" $f.t insert end "Mouse Actions:\n" HEAD $f.t insert end "Click : Selects that key Click: (on Cross) Opens/closes folder\n\n" $f.t insert end "Arrow Key Actions:\n" HEAD $f.t insert end "Up : Moves selection to previous key Down : Moves selection to next key Right : Opens key folder (subkeys) Left : Closes key folder (subkeys)" } proc regb::make_readable key { set str {} foreach word [lrange [split $key _] 1 end] { regexp {(.)(.*)} $word -> l rest lappend str "$l[string tolower $rest]" } join $str } proc regb::build_tree_tab {nb key} { set font {Tahoma 8} set f [$nb insert end $key -text [make_readable $key]] set pw [panedwindow $f.pw -ori vert] bind $pw <Double-1> {toggle'ori %W} set tf [labelframe $pw.tf -text $key -font $font] $pw add $tf set sw [ScrolledWindow $tf.sw -relief sunken -borderwidth 0] set tree [Tree $sw.tree -deltax 8 \ -opencmd "regb::change_node 1 $sw.tree" \ -closecmd "regb::change_node 0 $sw.tree"] $sw setwidget $tree pack $sw -fill both -expand yes set sw [ScrolledWindow $pw.sw -borderwidth 0] $pw add $sw set txt [text $sw.txt -font $font] $txt tag config MAINKEY -font "$font bold" $sw setwidget $txt pack $pw -fill both -expand yes after idle "$pw sash place 0 0 140" $tree configure -selectcommand "regb::update_contents $txt" $nb itemconfigure $key \ -createcmd "regb::init_tree $tree $key" \ -raisecmd "focus $tree" return $tree } proc toggle'ori w { $w config -ori [expr {[$w cget -ori] eq "horizontal"? "vertical" : "horizontal"}] } proc regb::init_tree {tw key} { variable PROGTXT "Creating Tree for \n $key" variable PROGINC -1 ProgressDlg .prg -textvariable ::regb::PROGTXT -variable ::regb::PROGINC \ -type infinite -maximum 50000 $tw configure -redraw 0 add_nodes $tw root $key 0 $tw configure -redraw 1 update destroy .prg } proc max args { if {[llength $args] == 1} { set args [lindex $args 0] } lindex [lsort -dict -dec $args] 0 } set regb::NODECOUNT 0 proc regb::add_nodes {tw node key {cfg 1}} { variable PROGINC if [catch {registry keys $key} keys] { tk_messageBox -icon error -title "Registry Lookup Failed" -message \ "Unable to get keys from registry.\nKey: $key\nError: $keys" } else { set cursor [$tw cget -cursor] $tw configure -cursor watch foreach k $keys { $tw insert end $node nd:[incr ::regb::NODECOUNT] \ -text $k \ -data "$key\\$k" \ -drawcross allways \ -image [Bitmap::get folder] incr PROGINC } $tw configure -cursor $cursor } set data "$key\n\n" if [catch {registry values $key} vals] { tk_messageBox -icon error -title "Registry Lookup Failed" -message \ "Unable to get values from registry.\nKey: $key\nError: $vals" append data "ERROR: Cannot Get Values" } else { set items {} foreach n $vals { set t [registry type $key $n] set v [registry get $key $n] if {$t eq "binary"} {set v [hexdump $v]} lappend items [format "%s (%s) %s" $n $t $v ] } if {[llength $items]} { append data [join $items "\n"] } else {append data "(no values)"} } if { $cfg } { $tw itemconfigure $node -drawcross auto -data $data } incr PROGINC } proc regb::update_contents {txt tw node} { $txt config -state normal $txt delete 1.0 end set dat [$tw itemcget $node -data] if {[$tw itemcget $node -drawcross] eq "allways"} { add_nodes $tw $node $dat set dat [$tw itemcget $node -data] } $txt insert end $dat $txt tag add MAINKEY 1.0 2.0 $txt config -state disabled } proc regb::change_node {open tw node} { if {$open} { if {[$tw itemcget $node -drawcross] eq "allways"} { add_nodes $tw $node [$tw itemcget $node -data] if {[llength [$tw nodes $node]]} { $tw itemconfigure $node -image [Bitmap::get openfold] } else { $tw itemconfigure $node -image [Bitmap::get folder] } } else { $tw itemconfigure $node -image [Bitmap::get openfold] } } else { $tw itemconfigure $node -image [Bitmap::get folder] } }#-- toplevel entry function
proc registrar {{w ""}} {regb::build_screen $w}
Note: even though this is only passively reading the registry, you can use it to change it as well. Just copy the text widget's contents into a buffer, put "registry set " in front, brace the name (because of the backslashes), remove the type (everything is an sz), and possibly quote the value. Eval and go...
MHo 2010-01-19: Just made a starpack of the above code because I quickly needed a browser to quickly inspect the registry while logged on as a normal user. Is there a way to avoid the invalid command name hexdump-message? I think this is a procedure available in your environment somewhere.
Category Windows