我想实现注册表定位,这个是自己找到的代码
不过,一直不能实现功能。
主要是,每次调试运行 都会弹框提示 “注册表编辑器无法启动”
另外,也不能实现注册表项的模拟打开。请高手帮忙看看代码,是哪里有错#include "stdafx.h"
#include<windows.h>
#include <iostream>     // not required by most systemsusing namespace std;void RegeditJump(HKEY hk,char* szRegPath);int _tmain(int argc, _TCHAR* argv[])
{  RegeditJump(HKEY_CLASSES_ROOT,".lnk");  return 0;
}void RegeditJump( HKEY hk, char* szRegPath)
{
if(strlen(szRegPath)<=0)
{
//assert(false);
return;
}
int                 pos;
char                * ch;
HWND                regeditHwnd, regeditMainHwnd;
HKEY                hKey;
char                *value = NULL;
DWORD               status;
char                RegPath[MAX_PATH];
DEVMODE             devMode; // 使色彩深度,能够影响速度注册表编辑器
// 响应键盘命令 devMode.dmSize = sizeof(DEVMODE);
EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &devMode ); sprintf( RegPath, "\\%s", szRegPath);
//HKEY hk = GetRootKey(szRegPath);
//String strSub = GetSubKey(szRegPath);
if(strlen(szRegPath)<=0 || hk==NULL)
return;
status = RegOpenKey( hk, szRegPath, &hKey ); // 它是一个值或一个键的处理方法
if( status == ERROR_SUCCESS ) { RegCloseKey( hKey );
strcat( RegPath, "\\" );

else 
{
value = strrchr( RegPath, '\\')+1;
*strrchr( RegPath, '\\' ) = 0;
} // 打开注册表编辑器
regeditMainHwnd = FindWindow( "RegEdit_RegEdit", NULL );
if ( regeditMainHwnd == NULL )  
{
SHELLEXECUTEINFO info;
memset( &info, 0, sizeof info );
info.cbSize = sizeof info;
info.fMask                = SEE_MASK_NOCLOSEPROCESS; 
info.lpVerb                = "open"; 
info.lpFile                = "regedit.exe"; 
info.nShow                = SW_SHOWNORMAL; 
ShellExecuteEx( &info );
WaitForInputIdle( info.hProcess, INFINITE );
regeditMainHwnd = FindWindow( "RegEdit_RegEdit", NULL );
}  if( regeditMainHwnd == NULL ) 
{ MessageBox( NULL, "注册表编辑器无法启动.","Error", MB_OK|MB_ICONERROR );
return;
}
ShowWindow( regeditMainHwnd, SW_SHOW );
SetForegroundWindow( regeditMainHwnd ); // 获取treeview
regeditHwnd = FindWindowEx( regeditMainHwnd, NULL, "SysTreeView32", NULL );
SetForegroundWindow( regeditHwnd );
SetFocus( regeditHwnd ); // 关闭上次打开的内容
for ( pos = 0; pos < 30; ++pos )  
{
UINT vk = VK_LEFT;
SendMessage( regeditHwnd, WM_KEYDOWN, vk, 0 );
} // 等待打开显示出内容 - 
// 注册表编辑器需要一段时间才能打开更多键子项
// 运行在颜色深度较高的时候
if( devMode.dmBitsPerPel > 8 ) 
::Sleep(750);  // 打开路径
for ( ch = RegPath; *ch; ++ch ) 
{
if ( *ch == '\\' )  
{
UINT vk = VK_RIGHT;
SendMessage( regeditHwnd, WM_KEYDOWN, vk, 0 ); // 等待打开显示出内容 - 
// 注册表编辑器需要一段时间才能打开更多键子项
// 运行在颜色深度较高的时候
if( devMode.dmBitsPerPel > 8 )
::Sleep(750);  } 
else 
{
UINT vk = toupper(*ch);
SendMessage( regeditHwnd, WM_CHAR, vk, 0 );
}
} // 如果,它的值是被选中的值的处理方法。
if( value ) 
{
UINT vk = VK_HOME; regeditHwnd = FindWindowEx( regeditMainHwnd, NULL, "SysListView32", NULL );
SetForegroundWindow( regeditHwnd );
SetFocus( regeditHwnd );
::Sleep(1000); // 要更新的注册表编辑器等的ListView
SendMessage( regeditHwnd, WM_KEYDOWN, vk, 0 ); for ( ch = value; *ch; ++ch ) 
{
UINT vk = toupper(*ch); SendMessage( regeditHwnd, WM_CHAR, vk, 0 );
}
} SetForegroundWindow( regeditMainHwnd );
SetFocus( regeditMainHwnd );
}