Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перехват Ctrl+Shift / 15 сообщений из 15, страница 1 из 1
01.11.2005, 13:12
    #33355088
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Делаю перехват клавиш 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
01.11.2005, 13:15
    #33355096
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Этот код стоит в KeyDown
...
Рейтинг: 0 / 0
01.11.2005, 18:15
    #33356061
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Почему не срабатывает Shift.Clear();
...
Рейтинг: 0 / 0
02.11.2005, 11:14
    #33356931
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Как использовать RegisterHotKey или Hook
...
Рейтинг: 0 / 0
02.11.2005, 11:57
    #33357071
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
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
02.11.2005, 13:04
    #33357323
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Не совсем ясно, что и как...
Если нужно перехватить нажатие CTRL+SHIFT (у меня это переключение раскладки клавы, вместо него я подставляю своё)

hk=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHook,NULL,GetCurrentThreadId()); ???
...
Рейтинг: 0 / 0
02.11.2005, 13:23
    #33357393
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
В KeyDown я определяю, что нажаты CTRL+SHIFT, а затем вызываю
LRESULT CALLBACK KeyHook (int nCode,WPARAM wParam,LPARAM lParam)
правда не ясно какие параметры ставить...
Там я загружаю уже свою раскладку. Только с LRESULT CALLBACK KeyHook
я ещё не разобрался!
...
Рейтинг: 0 / 0
02.11.2005, 16:56
    #33358248
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
1) Как с какими параметрами вызывается KeyHook (можно простой пример)
2) KeyHook нужно вызывать в KeyDown&&KeyUp или KeyDown||KeyUp ?
...
Рейтинг: 0 / 0
02.11.2005, 18:31
    #33358588
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Можно ли в KeyHook словить не одну, а комбинацию клавиш
Ctrl+Shift. И затем там же убить её.
...
Рейтинг: 0 / 0
02.11.2005, 18:56
    #33358658
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Код: 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
03.11.2005, 09:38
    #33359215
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
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
03.11.2005, 09:47
    #33359241
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
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
03.11.2005, 18:02
    #33360965
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Станислав 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
03.11.2005, 19:08
    #33361126
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Код: 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
04.11.2005, 13:54
    #33361723
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват Ctrl+Shift
Я нашел решение см топик Перехват переключения раскладки клавы
Тема закрыта!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перехват Ctrl+Shift / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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