Rocky_Bas Ответов: 2

Как отключить/включить параметры копирования/вырезания/вставки/удаления с помощью правой кнопки мыши в windows с помощью MFC


Привет,

Используя мое приложение MFC, мне придется отключить копировать/вырезать/вставить/удалить из системы Windows, я был успешным в отключение тем, при использовании клавиатуры комбинации клавиш(Ctrl+с,Ctwhen ЛТИ+в,сочетание клавиш Ctrl+х,нажмите Ctrl+D), но меня поражает отключения же на правой кнопке мыши,так что если пользователь попытается сделать, копировать,вырезать,вставлять,удалять операции через правый клик мыши на эти варианты должны Показать отключенные,

Я сделал то же самое для отключения "Start Task Manager"(когда пользователь щелкает правой кнопкой мыши на панели задач), изменив имя значения реестра "DisableTaskMgr" и значение data как 1 в настройках реестра, и я успешно использовал это.

Есть ли какое-либо конкретное имя значения реестра, которое нужно установить в реестре, чтобы отключить параметры копирования/вырезания/вставки/удаления при щелчке правой кнопкой мыши, или есть какой-либо другой способ сделать это в MFC.


- будьте добры ,кто-нибудь может предложить мне то же самое.


заранее спасибо.

Sergey Alexandrovich Kryukov

Почему?!
--СА

Argonia

если эти кнопки Copy/Cut/Paste/Delete являются кнопками, вы можете поймать сообщение WM_CONTEXMENU (если вы хотите отключить их, если контекстное меню активировано ) или WM_RBUTTONDOWN всего за один клик .Вы можете отключить их с помощью CButton::EnableWindow(FALSE / TRUE)

Rocky_Bas

Привет,Аргония, спасибо за ответ.Но я должен отключить эту копию вырезать вставить удалить ключи из окон не на приложение iam работает.

Мне удалось успешно отключить клавиши shotcut key board для того же самого,но я отключил эти опции даже при щелчке правой кнопкой мыши.Потому что можно даже делать копирование,вырезать,вставлять,удалять с помощью мыши,поэтому любезно предложите мне это сделать.

2 Ответов

Рейтинг:
0

Joan M

Вас интересуют крючки:

Глобальные Обработчики Стекла [^]

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=против 85).aspx[^]

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=против 85).aspx[^]

Будьте осторожны: то, что говорит Вам Сергей, более чем верно.


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-это единственная надежда (кроме ожидания, что любой другой участник даст вам дополнительную помощь в этом).

Извините...

Рейтинг:
0

Sergey Alexandrovich Kryukov

Не делай этого. Разумные пользователи такого оскорбления не простят. Лучше объясните, почему вы думаете, что вам это нужно, чтобы получить лучший совет.

—СА


Rocky_Bas

Привет Сергей,

Это права,которые я должен предоставить в своем приложении, вот почему я хочу отключить и, если потребуется, включить их.