Get Symbolic Name Of Key Combination Code
I've got such source code from MFC:
Code:
CString CHotKeyCtrl::GetKeyName(UINT vk, BOOL fExtended)
{
LONG lScan = MapVirtualKey(vk, 0) << 16;
// if it's an extended key, add the extended flag
if (fExtended)
lScan |= 0x01000000L;
CString str;
int nBufferLen = 64;
int nLen;
do
{
nBufferLen *= 2;
LPTSTR psz = str.GetBufferSetLength(nBufferLen);
nLen = ::GetKeyNameText(lScan, psz, nBufferLen + 1);
str.ReleaseBuffer(nLen);
}
while (nLen == nBufferLen);
return str;
}
CString CHotKeyCtrl::GetHotKeyName() const
{
ASSERT(::IsWindow(m_hWnd));
CString strKeyName;
WORD wCode;
WORD wModifiers;
GetHotKey(wCode, wModifiers);
if (wCode != 0 || wModifiers != 0)
{
if (wModifiers & HOTKEYF_CONTROL)
{
strKeyName += GetKeyName(VK_CONTROL, FALSE);
strKeyName += szPlus;
}
if (wModifiers & HOTKEYF_SHIFT)
{
strKeyName += GetKeyName(VK_SHIFT, FALSE);
strKeyName += szPlus;
}
if (wModifiers & HOTKEYF_ALT)
{
strKeyName += GetKeyName(VK_MENU, FALSE);
strKeyName += szPlus;
}
strKeyName += GetKeyName(wCode, wModifiers & HOTKEYF_EXT);
}
return strKeyName;
}
i want to rewrite it using std::string(or char []), but i don't know std::string prototypes for CString::GetBufferSetLength and CString::ReleaseBuffer. Can you help me?
Re: Get Symbolic Name Of Key Combination Code
You could dynamically allocate a TCHAR array and then deallocate it after use.
TCHAR* psz = new TCHAR[nBufferLen + 1];
.
.
.
delete [] psz;
char and string don't work with unicode data.
Re: Get Symbolic Name Of Key Combination Code
I hve code like this(i rewrite this code for your recommendations):
Code:
std::wstring getKeyName(UINT vk, BOOL fExtended)
{
LONG lScan = MapVirtualKey(vk, 0) << 16;
// if it's an extended key, add the extended flag
if (fExtended)
lScan |= 0x01000000L;
int nBufferLen = 64;
wchar_t* str;
int nLen;
do
{
nBufferLen *= 2;
str = new wchar_t[nBufferLen + 1];
nLen = ::GetKeyNameText(lScan, (LPWSTR)str, nBufferLen + 1);
delete [] str;
}
while (nLen == nBufferLen);
return str;
}
std::wstring getHotkeyName(Hotkey hk)
{
std::wstring strKeyName;
WORD wCode = LOBYTE(hk);
WORD wModifiers = HIBYTE(hk);
if (wCode != 0 || wModifiers != 0)
{
if (wModifiers & HOTKEYF_CONTROL)
{
strKeyName += getKeyName(VK_CONTROL, FALSE);
strKeyName += L"+";
}
if (wModifiers & HOTKEYF_SHIFT)
{
strKeyName += getKeyName(VK_SHIFT, FALSE);
strKeyName += L"+";
}
if (wModifiers & HOTKEYF_ALT)
{
strKeyName += getKeyName(VK_MENU, FALSE);
strKeyName += L"+";
}
strKeyName += getKeyName(wCode, FALSE);
}
return strKeyName;
}
but i've got error in wcslen.c. What i do unduly?
Re: Get Symbolic Name Of Key Combination Code
You are trying to return some garbage ('str' is deleted before).
To replace CString with std::wstring, use the next code
Code:
// ... same as above
std::wstring str;
int nLen;
do
{
nBufferLen *= 2;
str.resize(nBufferLen);
nLen = ::GetKeyNameTextW(lScan, &str[0], nBufferLen);
}
while (nLen == nBufferLen);
return str;
}
1 Attachment(s)
Re: Get Symbolic Name Of Key Combination Code
2 ovidiucucu
but i all the same have garbage(see attache)
my code:
Code:
std::wstring getKeyName(UINT vk, BOOL fExtended)
{
LONG lScan = MapVirtualKey(vk, 0) << 16;
// if it's an extended key, add the extended flag
if (fExtended)
lScan |= 0x01000000L;
int nBufferLen = 64;
std::wstring str;
int nLen;
do
{
nBufferLen *= 2;
str.resize(nBufferLen);
nLen = ::GetKeyNameTextW(lScan, &str[0], nBufferLen);
}
while (nLen == nBufferLen);
return str;
}
Re: Get Symbolic Name Of Key Combination Code
problem located in this function
Code:
std::wstring getHotkeyName(Hotkey hk)
{
std::wstring strKeyName;
WORD wCode = LOBYTE(hk);
WORD wModifiers = HIBYTE(hk);
if (wCode != 0 || wModifiers != 0)
{
if (wModifiers & HOTKEYF_CONTROL)
{
strKeyName += getKeyName(VK_CONTROL, FALSE);
strKeyName += L"+";
}
if (wModifiers & HOTKEYF_SHIFT)
{
strKeyName += getKeyName(VK_SHIFT, FALSE);
strKeyName += L"+";
}
if (wModifiers & HOTKEYF_ALT)
{
strKeyName += getKeyName(VK_MENU, FALSE);
strKeyName += L"+";
}
strKeyName += getKeyName(wCode, FALSE);
}
return strKeyName;
}
because getKeyName is working normally(i understood it by debugging). What i do unduly?
Re: Get Symbolic Name Of Key Combination Code
Ah, forgot a little detail
Code:
std::wstring getKeyName(UINT vk, BOOL fExtended)
{
// same as in my previous post
return str.c_str();
}
I hope now is "unduly". :)
Re: Get Symbolic Name Of Key Combination Code