133 lines
2.5 KiB
C++
133 lines
2.5 KiB
C++
|
// Copyright (c) 2000 Microsoft Corporation
|
||
|
//
|
||
|
// password edit control wrapper
|
||
|
//
|
||
|
// 6 Nov 2000 sburns
|
||
|
//
|
||
|
// added to fix NTRAID#NTBUG9-202238-2000/11/06-sburns
|
||
|
//
|
||
|
// most of this is stolen from johnstep's common cred ui
|
||
|
// ds/win32/credui
|
||
|
|
||
|
|
||
|
|
||
|
#include "pch.h"
|
||
|
#include "PasswordEditBox.hpp"
|
||
|
|
||
|
|
||
|
|
||
|
PasswordEditBox::PasswordEditBox()
|
||
|
{
|
||
|
LOG_CTOR(PasswordEditBox);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
PasswordEditBox::~PasswordEditBox()
|
||
|
{
|
||
|
LOG_DTOR(PasswordEditBox);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
PasswordEditBox::Init(HWND editControl)
|
||
|
{
|
||
|
LOG_FUNCTION(PasswordEditBox::Init);
|
||
|
ASSERT(Win::GetClassName(editControl) == L"Edit");
|
||
|
|
||
|
// By commenting out this code, we disable the subclassing and therefore
|
||
|
// the caps lock warning bubble. We do this because it appears that the
|
||
|
// edit box common control now offers that same functionality.
|
||
|
// NTRAID#NTBUG9-255537-2000/12/12-sburns to disable the code
|
||
|
// NTRAID#NTBUG9-255568-2000/12/12-sburns to remove the code from the source
|
||
|
// tree entirely.
|
||
|
//
|
||
|
// HRESULT hr = ControlSubclasser::Init(editControl);
|
||
|
// if (SUCCEEDED(hr))
|
||
|
// {
|
||
|
// // set the options on the edit control
|
||
|
//
|
||
|
// Win::Edit_LimitText(hwnd, DS::MAX_PASSWORD_LENGTH);
|
||
|
//
|
||
|
// // (could also set the password style bit here, if we wanted.)
|
||
|
//
|
||
|
// balloonTip.Init(hwnd);
|
||
|
// }
|
||
|
//
|
||
|
// return hr;
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
bool
|
||
|
IsCapsLockOn()
|
||
|
{
|
||
|
// LOG_FUNCTION(IsCapsLockOn);
|
||
|
|
||
|
return (::GetKeyState(VK_CAPITAL) & 1) ? true : false;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
LRESULT
|
||
|
PasswordEditBox::OnMessage(UINT message, WPARAM wparam, LPARAM lparam)
|
||
|
{
|
||
|
// LOG_FUNCTION(PasswordEditBox::OnMessage);
|
||
|
|
||
|
switch (message)
|
||
|
{
|
||
|
case WM_KEYDOWN:
|
||
|
{
|
||
|
|
||
|
if (wparam == VK_CAPITAL)
|
||
|
{
|
||
|
// user pressed caps lock key
|
||
|
|
||
|
balloonTip.Show(IsCapsLockOn());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// they hit some other key, so get rid of the tool tip
|
||
|
|
||
|
balloonTip.Show(false);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
case WM_SETFOCUS:
|
||
|
{
|
||
|
// Make sure no one can steal the focus while a user is entering their
|
||
|
// password
|
||
|
|
||
|
::LockSetForegroundWindow(LSFW_LOCK);
|
||
|
|
||
|
balloonTip.Show(IsCapsLockOn());
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
case WM_PASTE:
|
||
|
{
|
||
|
balloonTip.Show(false);
|
||
|
break;
|
||
|
}
|
||
|
case WM_KILLFOCUS:
|
||
|
{
|
||
|
balloonTip.Show(false);
|
||
|
|
||
|
// Make sure other processes can set foreground window once again.
|
||
|
|
||
|
::LockSetForegroundWindow(LSFW_UNLOCK);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ControlSubclasser::OnMessage(message, wparam, lparam);
|
||
|
}
|
||
|
|
||
|
|
||
|
|