Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2016, 15:56   #1
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию GetAsyncKeyState

Здравствуйте. Такая проблема, сделал что то типа блокнотика для заметок, висит поверх всех окон и кликабельный насквозь, при нажатии ctrl+shift + мышку в окно - форма становится кликабельной, перетаскиваемой и тд, но вот проблема, если просто нажать контрол, потом шифт, в общем отдельно друг от друга то код всё равно срабатывает. Как можно переделать?

Код:
var
  p:TPoint;
begin
  GetCursorPos(p);
  if PtInRect(rect(Form1.Left,Form1.Top,Form1.Left+form1.Width, form1.Top+form1.Height),p) then
  begin
    if GetAsyncKeyState(VK_CONTROL) <>0 then
    begin
      if GetAsyncKeyState(VK_SHIFT) <>0 then
      begin
        SetWindowLong(Handle, GWL_EXSTYLE, lformstyle);
        AlphaBlend:=false;
      end
      else
      begin
        if ActiveControl<>mmo1 then
        begin
          SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT );
          AlphaBlend:=true;
        end;
      end;
    end
  end
  else
  begin
    //if ActiveControl<>mmo1 then
    if not lpressed then
    begin
      SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT );
      AlphaBlend:=true;
      mmo1.Width:=form1.ClientWidth+17;
    end;
    if GetAsyncKeyState(1)=0 then lpressed:=false;
  end;
end;
всё это в теле таймера (знаю, плохо)
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 20.04.2016, 16:29   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Попробуйте через KeyBoard Status.
Пример на совместное нажатие 3-х клавиш:
Код:
varKeybState: TKeyboardState;
begin
   GetKeyboardState(KeybState);
   If ( (KeybState[VK_CONTROL] and 128)=128 ) and
      ( (KeybState[VK_F5]      and 128)=128 ) and
      ( (KeybState[Ord('8')]   and 128)=128 ) then
       ShowMessage('CTRL+F5+8 Pressed');
end;
kropotkina-alice вне форума Ответить с цитированием
Старый 20.04.2016, 16:54   #3
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
if (GetAsyncKeyState(VK_CONTROL) < 0) and (GetAsyncKeyState(VK_SHIFT) < 0) then
  //...
NEoMASTERR, с хуком уже не вариант?

Последний раз редактировалось Filka; 20.04.2016 в 17:00.
Filka вне форума Ответить с цитированием
Старый 20.04.2016, 17:20   #4
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
Код:
if (GetAsyncKeyState(VK_CONTROL) < 0) and (GetAsyncKeyState(VK_SHIFT) < 0) then
  //...
NEoMASTERR, с хуком уже не вариант?
Последний и предпоследний пост не вариант. Не знаю как отловить 2 кнопки, в последнем посте GetAsyncKeyState.
GetKeyboardState после пары нажатий перестаёт работать
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
procedure TForm1.Timer1Timer(Sender: TObject); var h:hwnd; begin //if f1 if getasynckeystate($20)<>0 then begin if FindWin Kazik Помощь студентам 2 18.11.2012 20:44
На getasynckeystate() ругаеться Касперский? Дима я Win Api 9 19.08.2012 13:44
Принцип работы функции GetAsyncKeyState wwe2012 Общие вопросы C/C++ 0 10.04.2011 09:15
Функция GetAsyncKeyState(). Проблема проекта. Fabio Общие вопросы C/C++ 2 07.03.2009 09:12