Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перехват клавиш +, очистка очереди сообщений клавы 
V
    Опции темы
gonzales
Дата 26.3.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



Необходимо реализовать в обычном edit ввод сочетания горячих клавиш, то есть пользователь жмет Alt+F4, в едите отображается "Alt+F4", но окно при этом не сворачивается. Как перехватывать сообщения, я разобрался, а вот как после перехвата очистить очередь клавиатуры, чтобы сообщение не пошло в систему - не знаю.
 smile 
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
drkot
Дата 26.3.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



а необычный edit тебе подойдет?
ThotKey


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
gonzales
Дата 26.3.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



не пойдет, он не обрабатывает например tab, Ctrl+Esc и т.д.
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
drkot
Дата 26.3.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



тогда хук на клавиши ставь. благо об этом много написано


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
gonzales
Дата 26.3.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



примерно что-то типа хочется
Код

procedure EmptyKeyQueue;
 var
   Msg: TMsg;
 begin
   while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST,
     PM_REMOVE or PM_NOYIELD) do;
 end;

procedure TForm1.fmsg(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_KEYDOWN
  then
    begin
     EmptyKeyQueue;
    end;



--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
Sunvas
Дата 26.3.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



А зачем тебе уже зарезервированые горячие клавиши типа Alt+F4 и Ctrl+Esc??? Портить пользователю жизнь не есть хорошо.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
gonzales
Дата 27.3.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



это программа эмуляции нажатий клавиш клавы, поэтому в идеале я должн предоставить возможность любых сочетаний
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
Sunvas
Дата 27.3.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(gonzales @  27.3.2007,  11:25 Найти цитируемый пост)
это программа эмуляции нажатий клавиш клавы, поэтому в идеале я должн предоставить возможность любых сочетаний

Понятно. Вот набросал тебе код, который показывает коды всех нажатых клавиш.
Код

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var i:word;
begin
edit1.Text:='';
for i:=1 to 254 do
  if ((GetKeyState(i) AND 128)=128) then Edit1.Text:=Edit1.Text+inttostr(i)+' + ';
key:=0;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
key:=#0;
end;


 Значения этих клавиш - впиши сам, ибо вломно. Для полного счастья тебе надо поставить хук на клаву, чтобы при CTRL+ESC не открывало меню Пуск.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
gonzales
Дата 28.3.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



сенк, но похожий код у меня уже есть, вопрос как раз в другом, как отменить действия, при нажатии на системые клавиши???

пробовал, вот такой код, тоже не работает
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
  private
    { Private declarations }
  public
   kkey,kmod:Cardinal;
    { Public declarations }
  end;

    TNewEdit = Class(TEdit)
  Protected
    { Ïåðåêðûòàÿ îêîííàÿ ïðîöåäóðà êîìïîíåíòà }
    Procedure WndProc(Var Msg: TMessage); Override;
  End;

var
  Form1: TForm1;
  Edit: TNewEdit;

implementation

{$R *.dfm}

        procedure EmptyKeyQueue;
 var
   Msg: TMsg;
 begin
   while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST,
     PM_REMOVE or PM_NOYIELD) do;
 end;

procedure TNewEdit.WndProc(var Msg: TMessage);
begin
 if Msg.Msg = WM_KEYDOWN
  then
    begin
    form1.kkey:=Msg.WParam;
    form1.kmod:=Msg.LParam;
     Msg.Result:=0;
     EmptyKeyQueue;
     //Exit;
     form1.Edit1Change(self);
    end;
  Inherited WndProc(Msg);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
 Edit := TNewEdit.Create(Self);
  Edit.Parent := Self;
  Edit.Left := 8;
  Edit.Top := 8;
  Edit.Width := 100;
  Edit.OnChange:=Form1.Edit1Change;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
edit1.Text:=inttostr(form1.kkey);
end;

end.
 
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
gonzales
Дата 28.3.2007, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



хук кстати работает, попробую теперь все это объединить

Это сообщение отредактировал(а) gonzales - 28.3.2007, 15:01
--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
Sunvas
Дата 28.3.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(gonzales @  28.3.2007,  14:51 Найти цитируемый пост)
попробую теперь все это объединить

И код желательно приведи.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
gonzales
Дата 29.3.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



сделал, правда несколько через спину, но работает, дальше только оптимизация:

код либы
Код

library DisableHotKeys;

uses
  SysUtils,
  Windows,
  Messages, dialogs;

type
  KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo:Pointer;
  end;
  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;

const
  WH_KEYBOARD_LL = 13;
var
  HookHandle: hHook;
  kkode:cardinal;
  kmod:cardinal;

function KeyboardProc(nCode: integer; wParam: longint; lParam: longint): integer; stdcall;
var
  KeyStroke: boolean;
  p: PKBDLLHOOKSTRUCT;
begin
  KeyStroke := false;
  if (nCode = HC_ACTION) then
  begin
      case wParam of
        WM_KEYDOWN, WM_SYSKEYDOWN:
        begin
          p := PKBDLLHOOKSTRUCT(lParam);
          kkode:=p^.vkCode;
          kmod:=0;

          if (GetKeyState(VK_MENU) and $8000) <> 0 then
          kmod:=kmod or MOD_ALT;
          if (GetKeyState(VK_SHIFT) and $8000) <> 0 then
          kmod:=kmod or MOD_SHIFT;
          if (GetKeyState(VK_CONTROL) and $8000) <> 0 then
          kmod:=kmod or MOD_CONTROL;


       if ((kmod=1) and (kkode=9)) or    //alt+tab
          ((kmod=1)and (kkode=27)) or    //alt+esc
          ((kmod=2)and (kkode=27)) or    //ctrl+esc
          ((kmod=6)and (kkode=27)) or    //ctrl+Shift+esc
          ((kmod=3)and (kkode=46)) or    //Ctrl+Alt+Del - не работает
          ((kmod=1)and (kkode=115)) or   //alt+F4
          (kkode=91) or                  //Windows
          (kkode=9)                      //Tab
          then
          KeyStroke := true
          else
          KeyStroke := false;
        end;
      end;//case
  end;

  if KeyStroke then
    result := 1
  else
    result := CallNextHookEx(0, nCode, wParam, lParam);
end;


// установка, отключение ловушки
procedure Hook(lRun:Boolean); export; stdcall;
begin
 if lRun then
  HookHandle:=SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardProc, HInstance, 0)
 else
  begin
   UnhookWindowsHookEx(HookHandle);
   HookHandle:=0;
  end;
end;

function Get_Kkod:cardinal;
begin
 result:=kkode;
end;

function Get_Kmod:cardinal;
begin
 result:=kmod;
end;


exports Hook,Get_Kkod,Get_Kmod;

begin
end.



юзаем так

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Timer1: TTimer;
    procedure Edit1Enter(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

procedure Hook(lRun:Boolean) stdcall; external 'HookLib' name 'Hook';
function Kkod:cardinal stdcall; external 'HookLib' name 'Get_Kkod';
function Kmod:cardinal stdcall; external 'HookLib' name 'Get_Kmod';

{$R *.dfm}

procedure TForm1.Edit1Enter(Sender: TObject);
begin
Hook(True);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
Hook(False);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Edit1.Text:=inttostr(Kkod)+' + '+inttostr(Kmod);
end;

end.


--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0750 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.