📄 vncpropertiespoll.cpp
字号:
// Functions to load & save the settings
LONG
vncPropertiesPoll::LoadInt(HKEY key, LPCSTR valname, LONG defval)
{
LONG pref;
ULONG type = REG_DWORD;
ULONG prefsize = sizeof(pref);
if (RegQueryValueEx(key,
valname,
NULL,
&type,
(LPBYTE) &pref,
&prefsize) != ERROR_SUCCESS)
return defval;
if (type != REG_DWORD)
return defval;
if (prefsize != sizeof(pref))
return defval;
return pref;
}
char *
vncPropertiesPoll::LoadString(HKEY key, LPCSTR keyname)
{
DWORD type = REG_SZ;
DWORD buflen = 0;
BYTE *buffer = 0;
// Get the length of the AuthHosts string
if (RegQueryValueEx(key,
keyname,
NULL,
&type,
NULL,
&buflen) != ERROR_SUCCESS)
return 0;
if (type != REG_SZ)
return 0;
buffer = new BYTE[buflen];
if (buffer == 0)
return 0;
// Get the AuthHosts string data
if (RegQueryValueEx(key,
keyname,
NULL,
&type,
buffer,
&buflen) != ERROR_SUCCESS) {
delete [] buffer;
return 0;
}
// Verify the type
if (type != REG_SZ) {
delete [] buffer;
return 0;
}
return (char *)buffer;
}
void
vncPropertiesPoll::ResetRegistry()
{
vnclog.Print(LL_CLIENTS, VNCLOG("Reset Reg\n"));
char username[UNLEN+1];
HKEY hkLocal, hkLocalUser, hkDefault;
DWORD dw;
if (!vncService::CurrentUser((char *)&username, sizeof(username)))
return;
// If there is no user logged on them default to SYSTEM
if (strcmp(username, "") == 0)
strcpy((char *)&username, "SYSTEM");
// Try to get the machine registry key for WinVNC
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkLocal, &dw) != ERROR_SUCCESS)
{
hkLocalUser=NULL;
hkDefault=NULL;
goto LABELUSERSETTINGS;
}
// Now try to get the per-user local key
if (RegOpenKeyEx(hkLocal,
username,
0, KEY_READ,
&hkLocalUser) != ERROR_SUCCESS)
hkLocalUser = NULL;
// Get the default key
if (RegCreateKeyEx(hkLocal,
"Default",
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ,
NULL,
&hkDefault,
&dw) != ERROR_SUCCESS)
hkDefault = NULL;
if (hkLocalUser != NULL) RegCloseKey(hkLocalUser);
if (hkDefault != NULL) RegCloseKey(hkDefault);
if (hkLocal != NULL) RegCloseKey(hkLocal);
RegCloseKey(HKEY_LOCAL_MACHINE);
LABELUSERSETTINGS:
if ((strcmp(username, "SYSTEM") != 0))
{
HKEY hkGlobalUser;
if (RegCreateKeyEx(HKEY_CURRENT_USER,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkGlobalUser, &dw) == ERROR_SUCCESS)
{
RegCloseKey(hkGlobalUser);
RegCloseKey(HKEY_CURRENT_USER);
}
}
}
void
vncPropertiesPoll::Load(BOOL usersettings)
{
if (m_dlgvisible) {
vnclog.Print(LL_INTWARN, VNCLOG("service helper invoked while Properties panel displayed\n"));
return;
}
ResetRegistry();
char username[UNLEN+1];
HKEY hkLocal, hkLocalUser, hkDefault;
DWORD dw;
// NEW (R3) PREFERENCES ALGORITHM
// 1. Look in HKEY_LOCAL_MACHINE/Software/ORL/WinVNC3/%username%
// for sysadmin-defined, user-specific settings.
// 2. If not found, fall back to %username%=Default
// 3. If AllowOverrides is set then load settings from
// HKEY_CURRENT_USER/Software/ORL/WinVNC3
// GET THE CORRECT KEY TO READ FROM
// Get the user name / service name
if (!vncService::CurrentUser((char *)&username, sizeof(username)))
return;
// If there is no user logged on them default to SYSTEM
if (strcmp(username, "") == 0)
strcpy((char *)&username, "SYSTEM");
// Try to get the machine registry key for WinVNC
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkLocal, &dw) != ERROR_SUCCESS)
{
hkLocalUser=NULL;
hkDefault=NULL;
goto LABELUSERSETTINGS;
}
// Now try to get the per-user local key
if (RegOpenKeyEx(hkLocal,
username,
0, KEY_READ,
&hkLocalUser) != ERROR_SUCCESS)
hkLocalUser = NULL;
// Get the default key
if (RegCreateKeyEx(hkLocal,
"Default",
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ,
NULL,
&hkDefault,
&dw) != ERROR_SUCCESS)
hkDefault = NULL;
LABELUSERSETTINGS:
// LOAD THE USER PREFERENCES
// Set the default user prefs
vnclog.Print(LL_INTINFO, VNCLOG("clearing user settings\n"));
m_pref_TurboMode = FALSE;
m_pref_PollUnderCursor=FALSE;
m_pref_PollForeground=TRUE;
m_pref_PollFullScreen=TRUE;
m_pref_PollConsoleOnly=FALSE;
m_pref_PollOnEventOnly=TRUE;
m_pref_Driver=CheckVideoDriver(0);
m_pref_Hook=TRUE;
m_pref_Virtual=FALSE;
// Load the local prefs for this user
if (hkDefault != NULL)
{
vnclog.Print(LL_INTINFO, VNCLOG("loading DEFAULT local settings\n"));
LoadUserPrefsPoll(hkDefault);
}
if (m_usersettings) {
// We want the user settings, so load them!
if (hkLocalUser != NULL)
{
vnclog.Print(LL_INTINFO, VNCLOG("loading \"%s\" local settings\n"), username);
LoadUserPrefsPoll(hkLocalUser);
}
// Now override the system settings with the user's settings
// If the username is SYSTEM then don't try to load them, because there aren't any...
if ((strcmp(username, "SYSTEM") != 0))
{
HKEY hkGlobalUser;
if (RegCreateKeyEx(HKEY_CURRENT_USER,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkGlobalUser, &dw) == ERROR_SUCCESS)
{
vnclog.Print(LL_INTINFO, VNCLOG("loading \"%s\" global settings\n"), username);
LoadUserPrefsPoll(hkGlobalUser);
RegCloseKey(hkGlobalUser);
// Close the user registry hive so it can unload if required
RegCloseKey(HKEY_CURRENT_USER);
}
}
}
if (hkLocalUser != NULL) RegCloseKey(hkLocalUser);
if (hkDefault != NULL) RegCloseKey(hkDefault);
if (hkLocal != NULL) RegCloseKey(hkLocal);
// Make the loaded settings active..
ApplyUserPrefs();
// Note whether we loaded the user settings or just the default system settings
m_usersettings = usersettings;
}
void
vncPropertiesPoll::LoadUserPrefsPoll(HKEY appkey)
{
m_pref_TurboMode = LoadInt(appkey, "TurboMode", m_pref_TurboMode);
// Polling prefs
m_pref_PollUnderCursor=LoadInt(appkey, "PollUnderCursor", m_pref_PollUnderCursor);
m_pref_PollForeground=LoadInt(appkey, "PollForeground", m_pref_PollForeground);
m_pref_PollFullScreen=LoadInt(appkey, "PollFullScreen", m_pref_PollFullScreen);
m_pref_PollConsoleOnly=LoadInt(appkey, "OnlyPollConsole", m_pref_PollConsoleOnly);
m_pref_PollOnEventOnly=LoadInt(appkey, "OnlyPollOnEvent", m_pref_PollOnEventOnly);
m_pref_Driver=LoadInt(appkey, "EnableDriver", m_pref_Driver);
if (m_pref_Driver)m_pref_Driver=CheckVideoDriver(0);
m_pref_Hook=LoadInt(appkey, "EnableHook", m_pref_Hook);
m_pref_Virtual=LoadInt(appkey, "EnableVirtual", m_pref_Virtual);
}
void
vncPropertiesPoll::ApplyUserPrefs()
{
// APPLY THE CACHED PREFERENCES TO THE SERVER
m_server->TurboMode(m_pref_TurboMode);
// Polling prefs
m_server->PollUnderCursor(m_pref_PollUnderCursor);
m_server->PollForeground(m_pref_PollForeground);
m_server->PollFullScreen(m_pref_PollFullScreen);
m_server->PollConsoleOnly(m_pref_PollConsoleOnly);
m_server->PollOnEventOnly(m_pref_PollOnEventOnly);
if (CheckVideoDriver(0) && m_pref_Driver) m_server->Driver(m_pref_Driver);
else m_server->Driver(false);
m_server->Hook(m_pref_Hook);
m_server->Virtual(m_pref_Virtual);
}
void
vncPropertiesPoll::SaveInt(HKEY key, LPCSTR valname, LONG val)
{
RegSetValueEx(key, valname, 0, REG_DWORD, (LPBYTE) &val, sizeof(val));
}
void
vncPropertiesPoll::Save()
{
HKEY appkey;
DWORD dw;
// NEW (R3) PREFERENCES ALGORITHM
// The user's prefs are only saved if the user is allowed to override
// the machine-local settings specified for them. Otherwise, the
// properties entry on the tray icon menu will be greyed out.
// GET THE CORRECT KEY TO READ FROM
if (m_usersettings) {
// Verify that we know who is logged on
char username[UNLEN+1];
if (!vncService::CurrentUser((char *)&username, sizeof(username)))
return;
if (strcmp(username, "") == 0)
return;
// Try to get the per-user, global registry key for WinVNC
if (RegCreateKeyEx(HKEY_CURRENT_USER,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ, NULL, &appkey, &dw) != ERROR_SUCCESS)
return;
} else {
// Try to get the default local registry key for WinVNC
HKEY hkLocal;
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkLocal, &dw) != ERROR_SUCCESS) {
MessageBox(NULL, sz_ID_MB1, sz_ID_WVNC, MB_OK);
return;
}
if (RegCreateKeyEx(hkLocal,
"Default",
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ, NULL, &appkey, &dw) != ERROR_SUCCESS) {
RegCloseKey(hkLocal);
return;
}
RegCloseKey(hkLocal);
}
// SAVE PER-USER PREFS IF ALLOWED
SaveUserPrefsPoll(appkey);
RegCloseKey(appkey);
RegCloseKey(HKEY_CURRENT_USER);
}
void
vncPropertiesPoll::SaveUserPrefsPoll(HKEY appkey)
{
SaveInt(appkey, "TurboMode", m_server->TurboMode());
// Polling prefs
SaveInt(appkey, "PollUnderCursor", m_server->PollUnderCursor());
SaveInt(appkey, "PollForeground", m_server->PollForeground());
SaveInt(appkey, "PollFullScreen", m_server->PollFullScreen());
SaveInt(appkey, "OnlyPollConsole", m_server->PollConsoleOnly());
SaveInt(appkey, "OnlyPollOnEvent", m_server->PollOnEventOnly());
SaveInt(appkey, "EnableDriver", m_server->Driver());
SaveInt(appkey, "EnableHook", m_server->Hook());
SaveInt(appkey, "EnableVirtual", m_server->Virtual());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -