Рейтинг:
0
Rocky_Bas
Привет, Джоан,я могу отслеживать события клавиатуры и мыши с помощью крючков,но как именно остановиться, чтобы сделать эту конкретную операцию.
Я имею в виду ,что я пользователь нажимает кнопку удаления ,в этот момент после отслеживания события удаления, как остановить его удаление.
Joan M
Ну, все зависит от метода, который вы используете для захвата нажатий клавиш, но обычно в функциях захвата есть возвращаемое значение, которое позволит вам продолжить обработку сообщения или нет.
Я не знаю, какой метод вы выбрали, но взгляните на возвращаемое значение функции, которую вы используете для предварительной обработки нажатий клавиш.
Rocky_Bas
В функции нажатия клавиши я сохранил условие
if(wParam == VK_DELETE)
таким образом,с этим условием я могу знать, что пользователь нажал кнопку удаления на клавиатуре, теперь в этом мне нужно вернуть что-то, чтобы пользователь не мог удалить.
Joan M
Извините, но я не знаю функции "нажатие клавиши"... вы используете сообщение для предварительного перевода? обработка любого сообщения? Ну, я уверен, что вы обрабатываете сообщение, так как здесь у вас есть параметр wparam, но... какой именно?
Rocky_Bas
Функция нажатия клавиши означает, что она захватывает события клавиатуры
Joan M
Да, конечно :) Я понимаю значение нажатия клавиши...
Я спрашиваю вот о чем: нажатие клавиши вызывается, когда произошло определенное событие... какое это событие? как вы связали функцию нажатия клавиши с этим событием? с каким сообщением вы здесь работаете? это PreTranslateMessage, WM_KEYUP, WM_KEYDOWN... ?
Joan M
Что такое предложение return функции "нажатие клавиши"?
Rocky_Bas
ниже приведен мой код для нажатия клавиши ,это нажатие будет вызвано,если я нажму что-нибудь на клавиатуре, поэтому я использую виртуальную клавишу VK_DELETE для отслеживания события удаления.
LRESULT CRecordPlayerDlg::OnKeyStroke(параметр wparam параметр wparam, lparam должен параметр lparam)
{
m_nTimeStamp = GetTickCount() - m_nTimeStamp;
CString в csKeyTyped;
CString в csKeyStatus;
csKeyStatus = "0/0/0/0/0/0/0/0/0/00";
если ((параметр wparam==VK_SPACE)||(параметр wparam==VK_RETURN)||
(параметр wparam&ГТ;=с 0x2f ) и усилитель; &(параметр wparam&ЛТ;=0x100))
{
// CAPSTATE,LSHIFT,LCTRL, LWINDOW, LALT, RALT, RWIN, MENU,RCTRL, RSHIFT,NUMLCOK
Короткий nCapital = GetKeyState( VK_CAPITAL );
// Левосторонний
//****************************************************************************
SHORT nVirtKeyLeftShift = GetAsyncKeyState(VK_LSHIFT);
Короткий nLeftControl = GetAsyncKeyState( VK_LCONTROL );
// жестко запрограммированный
Короткие nLWindows = GetAsyncKeyState( VK_LWIN );
SHORT nLAlt = GetAsyncKeyState( VK_LMENU );
//****************************************************************************
// правая сторона
Короткий nRAlt = GetAsyncKeyState( VK_RMENU );
// Жестко запрограммированный
SHORT nRWin = GetAsyncKeyState( VK_RWIN );
Короткий nMenu = GetAsyncKeyState( VK_APPS );
SHORT nRightControl = GetAsyncKeyState( VK_LCONTROL );
SHORT nVirtKeyRightShift= GetAsyncKeyState(VK_RSHIFT);
SHORT nVirtKeyCopy = GetAsyncKeyState(VK_DELETE);
//*****************************************************************************
// Num Lock
SHORT nNumLock = GetKeyState( VK_NUMLOCK );
int nCurrentPos = 0;
если( 0 != nCapital )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
если( 0 != nVirtKeyLeftShift )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
if( 0 != nLeftControl )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
если( 0 != nLWindows )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
если( 0 != nLAlt )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
если( 0 != nRAlt )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
если( 0 != nRWin )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
если( 0 != nMenu )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
если( 0 != nRightControl )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
если( 0 != nVirtKeyRightShift )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
nCurrentPos = csKeyStatus.Find( SEPERATOR, nCurrentPos );
nCurrentPos++;
если( 0 != nNumLock )
{
Строку replacestring( csKeyStatus, nCurrentPos );
}
LPSTR csKey = new TCHAR[sizeof(TCHAR)];
GetKeyNameText( lParam, csKey, 4 );
csKeyTyped = csKey;
csKeyTyped += SEPERATOR;
csKeyStatus += SEPERATOR;
}
CString в csKeyFormat;
CString в csWParam;
csWParam.Формат( "%x¦", wParam);
CString csTime;
csTime.Формат( "%d", m_nTimeStamp );
csKeyFormat = "KeyBD¦";
csKeyFormat += csKeyTyped;
csKeyFormat += csKeyStatus;
csKeyFormat += csWParam;
csKeyFormat += csTime;
csKeyFormat += "\n";
m_csArray.Добавить( csKeyFormat );
m_nTimeStamp = GetTickCount();
if(wParam == VK_DELETE)
{
/********
Нужно написать код для остановки события
*****/
}
возврат 1;
}
Joan M
Этот метод OnKeyStroke является новым для меня, вероятно, он не является стандартным и полностью зависит от диалогового класса CRecordPlayerDlg.
В любом случае, попробуйте вернуть 0, когда вы хотите отменить дальнейшую обработку сообщения.
Rocky_Bas
я пробовал таким же образом вернуть 0 ,но это не работает
Joan M
Затем в вашем диалоговом окне добавьте обработчик PreTranslateMessage и отфильтруйте сообщение там.
Смотрите: http://www.codeproject.com/Questions/40901/Disable-esc-key-exit-for-MFC-Application
Кто знает, как реализована функция OnKeyStroke, используйте стандартную опцию Microsoft, и вы будете в безопасности и порядке.
Удачи вам!
Rocky_Bas
Эй Джоан Мерт,
Теперь он работает, я могу запретить пользователю делать копирование/вырезание/вставку,но он работает только тогда,когда я использую клавиатуру,я даже хочу отключить его от параметров щелчка правой кнопкой мыши,я думаю, что это возможно через реестры, вы можете мне помочь в этом.
Rocky_Bas
Эй Джоан Мерт,
Теперь он работает, я могу запретить пользователю делать копирование/вырезание/вставку,но он работает только тогда,когда я использую клавиатуру,я даже хочу отключить его от параметров щелчка правой кнопкой мыши,я думаю, что это возможно через реестры, вы можете мне помочь в этом.
Joan M
С помощью pretranslate message вы можете напрямую отменить щелчок правой кнопкой мыши, но я никогда не делал модификацию реестра, о которой вы упоминаете, и я не могу дать вам больше помощи в этом... Я думаю, что поиск в google-это единственная надежда (кроме ожидания, что любой другой участник даст вам дополнительную помощь в этом).
Извините...