Click here to Skip to main content
Click here to Skip to main content

Quick Regedit Navigation

By , 29 Dec 2005
 

Introduction

How many times have you seen a post here at CP, or any place out on the Internet for that matter, that contained a reference to a long registry key, and thought how useful it would be if you could go straight to that key without having to type it into regedit? I think I have a solution.

Finding and Opening Regedit

To find Regedit's window, we search for and/or create the "RegEdit_RegEdit" window class.

CWnd *pWndRegeditMain = CWnd::FindWindow(_T("RegEdit_RegEdit"), NULL);
if (NULL == pWndRegeditMain)
{
    rShellExecuteInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    rShellExecuteInfo.fMask  = SEE_MASK_NOCLOSEPROCESS; 
    rShellExecuteInfo.lpVerb = _T("open"); 
    rShellExecuteInfo.lpFile = _T("regedit.exe"); 
    rShellExecuteInfo.nShow  = SW_SHOWNORMAL; 

    ShellExecuteEx(&rShellExecuteInfo);
    WaitForInputIdle(rShellExecuteInfo.hProcess, INFINITE);

    pWndRegeditMain = CWnd::FindWindow(_T("RegEdit_RegEdit"), NULL);
}

At this point, pWndRegeditMain should have a non-NULL value. Next, we need to show Regedit's window and bring it to the foreground.

pWndRegeditMain->ShowWindow(SW_SHOW);
pWndRegeditMain->SetForegroundWindow();

The TreeView

Since Regedit maintains the last-accessed key (see Extras), we must ensure a known starting point: the root node. To do this, we simply "send" the left arrow key several dozen times.

CWnd WndRegeditTreeview;
WndRegeditTreeview.Attach(FindWindowEx(pWndRegeditMain->GetSafeHwnd(), 
                                       NULL, _T("SysTreeView32"), NULL));
WndRegeditTreeview.SetForegroundWindow();
WndRegeditTreeview.SetFocus();

// close it up so we have a known starting point
for (int nDepth = 0; nDepth < 30; nDepth++)
    WndRegeditTreeview.SendMessage(WM_KEYDOWN, VK_LEFT, 0);

Now that we are at the root node, we can start our descent down to the desired key. The key, as far as this code is concerned, can be formed in one of two ways:

key\ 
key\value

To separate the two, we use:

CString strRegistryPath(argv[1]);

// the path must begin with a backslash
if (strRegistryPath.Left(1) != _T('\\'))
    strRegistryPath = _T('\\') + strRegistryPath;

int nIndex       = strRegistryPath.ReverseFind(_T('\\'));
CString strValue = strRegistryPath.Mid(nIndex + 1);
strRegistryPath  = strRegistryPath.Left(nIndex);

Note that when a backslash character is encountered, we "send" a right arrow key instead.

for (nIndex = 0; nIndex < strRegistryPath.GetLength(); nIndex++)
{
    UINT uVirtualKey = strRegistryPath[nIndex];

    if (_T('\\') == uVirtualKey)  
        WndRegeditTreeview.SendMessage(WM_KEYDOWN, VK_RIGHT, 0);
    else
    {
        uVirtualKey = toupper(uVirtualKey);
        WndRegeditTreeview.SendMessage(WM_CHAR, uVirtualKey, 0);
    }
}

At this point, we should be at the desired key in the left pane.

The ListView

Now if a value was also specified, we must switch over to the list view and select it.

CWnd WndRegeditListview;
WndRegeditListview.Attach(FindWindowEx(pWndRegeditMain->GetSafeHwnd(), 
                                       NULL, _T("SysListView32"), NULL));
WndRegeditListview.SetForegroundWindow();
WndRegeditListview.SetFocus();

// have to wait for Regedit to update the listview
Sleep(1000); 

// select the value
WndRegeditListview.SendMessage(WM_KEYDOWN, VK_HOME, 0);

for (nIndex = 0; nIndex < strValue.GetLength(); nIndex++)
{
    UINT uVirtualKey = toupper(strValue[nIndex]);
    WndRegeditListview.SendMessage(WM_CHAR, uVirtualKey, 0);
}

Our value should now be selected. We can detach the temporary view objects and exit the program.

Usage

From a command prompt, simply type regeditgo followed by the desired key\value. If the key and/or value contains any spaces, you'll need to surround it with double quotes.

Once Regedit has finished navigating down to the desired key, you should have something that resembles the following:

Extras

A feature that I happen to like is Regedit's automatic selection of the last-accessed key. The name of this key is stored in the following value:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey

You can keep Regedit from maintaining the last-accessed key by removing write permission to the Regedit key. However, there is a tradeoff. By doing so, you'll also be prohibiting Regedit from updating the FindFlags and View values.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

DavidCrow
Software Developer (Senior) Pinnacle Business Systems
United States United States
Member

The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.
 
HTTP 404 - File not found
Internet Information Services

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generalusing in commercial applicationmembermyalias1234567828 Nov '06 - 13:04 
I have made some modifications and would like to use it in a commercial application.... Is this fine? Anything special I have to do?
GeneralRe: using in commercial applicationmemberDavidCrow29 Nov '06 - 2:28 
myalias12345678 wrote:
Is this fine?

 
Sure.
 
myalias12345678 wrote:
Anything special I have to do?

 
Not that I know of.
 

"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

"Judge not by the eye but by the heart." - Native American Proverb


GeneralRe: using in commercial applicationmembermyalias1234567829 Nov '06 - 6:37 
Thanks!!!
QuestionRe: using in commercial applicationmemberDavidCrow29 Nov '06 - 6:59 
BTW, did you change something that was wrong, or just customize it to your specific need(s)?
 

"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

"Judge not by the eye but by the heart." - Native American Proverb


AnswerRe: using in commercial applicationmembermyalias1234567812 Dec '06 - 13:40 
Both.
 
When I passed it this key, for instance, HKEY_CURRENT_USER\Software\Adobe it would open up the key
 
HKEY_CURRENT_USER\Software... and select the default value. Also, there was no way of telling it whether there was a value being passed in or just a key. So what I did was the following. Fix the above problem and add a way to tell the program that it has a key. So the function now has the signature
 
int RegEditGo( LPCTSTR lpszRegistryPath, LPCTSTR hasValue )
 
So when I pass a key by the msdos prompt as follows
 

HKEY_CURRENT_USER\Software\Adobe value1
 
it will open regedit and select value1
 
whereas if I pass in
 
HKEY_CURRENT_USER\Software\Adobe
 
it will just open the above key and not select any value even the default.
 

General! Like RegMonmemberSynetech12 Aug '06 - 7:35 
Hi,
 
For those who are questioning the methodology used here, I should point out that it is the same method that other apps like RegMon, Registry Detective, and such use. You can see proof of this when you use one of those and tell it to open Regedit to a non-existent key. It will go as far as it can then beep the same beep that you hear when you manually type in a character for a key that doesn't exist. For example, if you tell it to open Regedit to HKCU\Software\Foo\Bar, but Bar doesn't exist, it will open Regedit and go to HKCU\Software\Foo, then beep.

 
--
Synetech

GeneralAuto-Completememberdavedoc29 Dec '05 - 9:38 
Nice idea, an implementation David. Thanks.
 
It could be even more useful if it could do auto-complete while typing the registry path.
GeneralRe: Auto-CompletememberMr.Prakash13 Jan '06 - 17:41 
davedoc wrote:
It could be even more useful if it could do auto-complete while typing the registry path.

 
if you are really going to type each key, then you are better off using the regedit.exe directly and click on nodes and expand it.
 

 


-Prakash
GeneralInteresting idea, but too much reliance on keystrokesmemberHerbCSO29 Dec '05 - 8:53 
It's not bad, but I think that relying this much on keystrokes to control Regedit's UI is a potential issue. I'd rather try and figure out what Regedit is using internally to navigate and try to call those functions (using messages or some such). Alternatively, you could simply stop Regedit when it's running, change the last visited key value and start regedit again - it navigates straight to the key without you doing anything else (of course, this only works in W2K and above, I believe).
 
--
Umm... what's a .sig? ;]
QuestionRe: Interesting idea, but too much reliance on keystrokesmemberDavidCrow29 Dec '05 - 10:00 
HerbCSO wrote:
It's not bad, but I think that relying this much on keystrokes to control Regedit's UI is a potential issue.

 
How so? Regedit works this way (i.e., keystrokes) across all platforms. How would usng some (possibly) undocumented API be any better?
 

"Take only what you need and leave the land as you found it." - Native American Proverb


General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130523.1 | Last Updated 29 Dec 2005
Article Copyright 2005 by DavidCrow
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid