我想实现注册表定位,这个是自己找到的代码
不过,一直不能实现功能。
主要是,每次调试运行 都会弹框提示 “注册表编辑器无法启动”
另外,也不能实现注册表项的模拟打开。请高手帮忙看看代码,是哪里有错#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 );
}
不过,一直不能实现功能。
主要是,每次调试运行 都会弹框提示 “注册表编辑器无法启动”
另外,也不能实现注册表项的模拟打开。请高手帮忙看看代码,是哪里有错#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 );
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货