powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перехват Ctrl+Shift
15 сообщений из 15, страница 1 из 1
Перехват Ctrl+Shift
    #33355088
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю перехват клавиш Ctrl+Shift и сам переключаю раскладку на ту что
"нужно" и разрешено:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//Переключение раскладки  en/ru  по Ctrl+Shift или Alt+Shift
if (Shift.Contains(ssShift)&&(Shift.Contains(ssCtrl)||Shift.Contains(ssAlt)))
 {
  //Отпускаем(гасим) Shift, если он нажат
  if (GetKeyState(VK_SHIFT)&0x8000)
    keybd_event(VK_SHIFT,  0 , KEYEVENTF_KEYUP,  0 );

  //установка раскладки
  SetLayout(); //моя ф-я 
 }

Но забивание шифта через keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
работает, если всего 2 раскладки En и Ru, а вот если добавить белорусский,
то почему-то keybd_event не работает. Что я не так делаю?
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33355096
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот код стоит в KeyDown
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33356061
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему не срабатывает Shift.Clear();
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33356931
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как использовать RegisterHotKey или Hook
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33357071
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SCORPION ZКак использовать RegisterHotKey или Hook
Например, так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
HHOOK hk;
LRESULT CALLBACK KeyHook (int,WPARAM,LPARAM);
TForm1 *Form1;
......
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 hk=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHook,NULL,GetCurrentThreadId());
....
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 UnhookWindowsHookEx(hk);
.........
}
//---------------------------------------------------------------------------
LRESULT CALLBACK KeyHook (int nCode,WPARAM wParam,LPARAM lParam)
{
 DWORD AltPress= 0 ;
 AltPress=lParam & 0x20000000;
 if(AltPress)
  {
   switch(wParam){
   case  33 :
    Form1->Hide();
    break;
   case  34 :
    Form1->Show();
    break;
   }
  }
 return CallNextHookEx(hk,nCode,wParam,lParam);
}
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33357323
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем ясно, что и как...
Если нужно перехватить нажатие CTRL+SHIFT (у меня это переключение раскладки клавы, вместо него я подставляю своё)

hk=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHook,NULL,GetCurrentThreadId()); ???
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33357393
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В KeyDown я определяю, что нажаты CTRL+SHIFT, а затем вызываю
LRESULT CALLBACK KeyHook (int nCode,WPARAM wParam,LPARAM lParam)
правда не ясно какие параметры ставить...
Там я загружаю уже свою раскладку. Только с LRESULT CALLBACK KeyHook
я ещё не разобрался!
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33358248
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) Как с какими параметрами вызывается KeyHook (можно простой пример)
2) KeyHook нужно вызывать в KeyDown&&KeyUp или KeyDown||KeyUp ?
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33358588
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли в KeyHook словить не одну, а комбинацию клавиш
Ctrl+Shift. И затем там же убить её.
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33358658
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LRESULT CALLBACK KeyHook (int nCode,WPARAM wParam,LPARAM lParam)
{

if ((nCode >=  0 ) && !(lParam & 0x80000000) )
{

  if(wParam==VK_SHIFT && (GetAsyncKeyState(VK_CONTROL)&0x8000))
  {
    Form1->Edit1->Text = "CTRL+SHIFT";
   // а вот как забить эту комбинацию ?
  ...
  }
}
 return CallNextHookEx(hk,nCode,wParam,lParam);  //или return 0;
}
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33359215
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SCORPION ZМожно ли в KeyHook словить не одну, а комбинацию клавиш
Ctrl+Shift. И затем там же убить её.
В KeyHook нельзя словить комбинацию клавиш, так как клавиши реально нажимаются не одновременно, а последовательно... А KeyHook ловит все нажатия клавиш, т.е. если нажаты две клавиши, то KeyHook вызовется дважды...
Чтобы отловить Ctrl+Shift я сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
...
HHOOK hk;
LRESULT CALLBACK KeyHook (int,WPARAM,LPARAM);
TForm1 *Form1;
DWORD Shift= 0 ,Ctrl= 0 ; //Глобальные переменные, следящие за нажатием 
                               //клавиш Shift и Ctrl соответственно
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 hk=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHook,NULL,GetCurrentThreadId()); //Ставим хук на нажатие клавиш на клавиатуре
 if(hk)
  MessageBox(NULL,"Hook enabled",MB_OK, 0 ); //Сообщаем об этом пользователю
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MessageBox(this->WindowHandle,"Search enabled",MB_OK, 0 );
}
//---------------------------------------------------------------------------
LRESULT CALLBACK KeyHook (int nCode,WPARAM wParam,LPARAM lParam)
{
 DWORD KeyPress= 0 ;
 //Из lParam вытягиваем код нажатой клавиши
 KeyPress=lParam>> 16 ;
 KeyPress=(AltPress<< 8 )>> 8 ;
 //Был нажат Shift
 if((KeyPress==0x2A)||(KeyPress==0x36))
  Shift=0x1;
 //Был нажат Ctrl
 if(KeyPress==0x1D)
  Ctrl=0x1;

  //Была нажата комбинация Shift+Ctrl
 if((Shift!= 0 )&&(Ctrl!= 0 ))
  {
   if(Form1->Button1->Enabled)
     {
      Form1->Button1->Enabled=false;
      Form1->Caption="Ctrl+Shift hooked";
      }
    else
    {
     Form1->Button1->Enabled=true;
     Form1->Caption="Ctrl+Shift unhooked";
     }
   Shift=Ctrl= 0 ;//Сбрасываем состояние клавиш...
   return  0 ; //Пропускаем остаток очереди сообщений
  }
 return CallNextHookEx(hk,nCode,wParam,lParam);
}
//--------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{ 
 //Убиваем хук и сообщаем об этом пользователю
 if(UnhookWindowsHookEx(hk))
  MessageBox(NULL,"Hook disabled",MB_OK, 0 );
}
//---------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33359241
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.:
Можно усилить контроль за нажатием клавиш:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
 if((AltPress==0x2A)||(AltPress==0x36))
  Shift=0x1;
 else if(AltPress==0x1D)
  Ctrl=0x1;
 else
  {
   Shift=Ctrl= 0 ;
   return CallNextHookEx(hk,nCode,wParam,lParam);
  }
...
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33360965
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав C.P.S.:
Можно усилить контроль за нажатием клавиш:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
 if((AltPress==0x2A)||(AltPress==0x36))
  Shift=0x1;
 else if(AltPress==0x1D)
  Ctrl=0x1;
 else
  {
   Shift=Ctrl= 0 ;
   return CallNextHookEx(hk,nCode,wParam,lParam);
  }
...

======================================
Ладно, Станислав, попробую твой код. Сегодня целый день был занят другой работой, но была у меня мысль сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
LRESULT CALLBACK KeyHook (int nCode,WPARAM wParam,LPARAM lParam)
{

if ((nCode >=  0 ) && !(lParam & 0x80000000) )
{
  if(wParam==VK_SHIFT && (GetAsyncKeyState(VK_MENU)&0x8000))
  {
   return  1 ; // блокируем не нужное нам 
  }

}
//пропускаем все остальное
 return CallNextHookEx(hk,nCode,wParam,lParam);  //или return 0;
}

Однако так блокировать комбинацию у меня не получилось.
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33361126
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 if((Shift!= 0 )&&(Ctrl!= 0 ))
  {
   if(Form1->Button1->Enabled)
     {
      Form1->Button1->Enabled=false;
      Form1->Caption="Ctrl+Shift hooked";
      }
    else
    {
     Form1->Button1->Enabled=true;
     Form1->Caption="Ctrl+Shift unhooked";
     }
   Shift=Ctrl= 0 ;//Сбрасываем состояние клавиш...
   return  0 ; //Пропускаем остаток очереди сообщений
  }

КОРОЧЕ - что это за хук. Нажатие Ctrl+Shift я могу определить и в KeyDown
своего приложения и там же определить Button1->Enabled. НО мне нужно не просто определить нажаты ли они обе(или заблокировать кнопочку), а нужно в хуке убить эту комбинацию! Т.е. сделать так, чтобы винда не переключала раскладку клавы, когда работает моё приложение !!!
Не ужели это сложно?
...
Рейтинг: 0 / 0
Перехват Ctrl+Shift
    #33361723
SCORPION Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я нашел решение см топик Перехват переключения раскладки клавы
Тема закрыта!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перехват Ctrl+Shift
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]