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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2008, 15:30   #1
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
Вопрос Перехват нажатий клавиш - АLT

Такой вопрос: в чем ошибка, не реагирует на нажатия клавиши Alt? При нажатии должна появляться кнопка на форме. С другими клавишами работает, но не с Alt. В чем ошибка и как исправить?

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
     klav : Integer;
     procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}




procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = klav then
  Button1.Visible:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
const
     vk_Menu    = $12;
begin
  klav := GlobalAddAtom('Hotkey4');
  RegisterHotKey(Handle, klav, 0, vk_Menu );
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   UnRegisterHotKey(Handle, klav);
   GlobalDeleteAtom(klav);
end;

end.
Заранее благодарен!
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 23.11.2008, 18:04   #2
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Прошу не обращать внимания на сообщение выше. При нажатии на Alt открывается системное меню формы. Как можно заблокировать данное действие и вместо него выполнять другое?
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 24.11.2008, 10:30   #3
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

http://pblog.ru/lab/?p=631
Код:
function HOOK(code: integer; wparam: wparam; lparam: lparam): lresult stdcall;
begin
  form1.Caption:=inttostr(wparam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowsHookEx(wh_keyboard,HOOK,HInstance,0);
end;
Kostia вне форума Ответить с цитированием
Старый 25.11.2008, 00:30   #4
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Подскажите, вот мы установили хук, а как его теперь удалить в процессе выполнения программы? Просто мне нужно блокировать нажатие клавиш лишь однажды. Выяснил что за это отвечает процедура UnhookWindowsHookEx, но у меня что-то ничего не получается...
Заранее благодарю за помощь!
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 25.11.2008, 09:03   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

посмотри какую ошибку эта функция возвращает. убедись в валидности хендла хука.
rpy3uH вне форума Ответить с цитированием
Старый 26.11.2008, 20:18   #6
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
Вопрос

Использую примерно такой код:

Код:
function HOOK(code: integer; wparam: wparam; lparam: lparam): lresult stdcall;
begin
  form1.Caption:=inttostr(wparam);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    Var theHook: THandle;
begin
  if (ssAlt in Shift) then begin
     SetWindowsHookEx(wh_keyboard,HOOK,HInstance,0);
     theHook:=SetWindowsHookEx(wh_keyboard,HOOK,HInstance,0);
     UnHookWindowsHookEx(theHook);
     {здесь код, который следует выполнять вместо показа системного меню формы}
  end;
end;
Но хук почему-то сразу не удаляется! Когда нажимаешь любые другие клавиши программа выполняет хук. Хук удаляется только тогда, когда перейдешь на другое окно, которое у тебя запущенно или др. программу, и понажимаешь там клавиши. Как с этим бороться? Может я не так удаляю хук или что-то забыл?
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 26.11.2008, 20:51   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

довольно-таки енпонятный код. зачем ставить хук и сразу снимать? непонятно зачем ты два раза вызываешь SetWindowsHookEx, в первый раз без сохранения результат в переменную во-второй раз с сохранением? Так как ты вызываешь её два раза значит хук ставится два раза. Следовательно надо его снимать два раза.
Кстати, где у тебя находится этот код? для нормальной работы глобального хука, он должен находиться в DLL.

установил хук
theHook:=SetWindowsHookEx(wh_keyboa rd,HOOK,HInstance,0);

снял хук
UnHookWindowsHookEx(theHook);

и всё
rpy3uH вне форума Ответить с цитированием
Старый 27.11.2008, 11:42   #8
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

theHook:=SetWindowsHookEx(wh_keyboa rd,HOOK,HInstan ce,0);
Так хук не устанавливается, проверял. Да и вообще, theHook, это переменная которая сохраняет номер хука, то значение которое возвращает ф-ция SetWindowsHookEx.
Да и потом, хук у меня устанавливается и снимается, но плохо. Чтобы снялся, нужно перейти на окно какой-то др. программы, окно программы должно стать неактивным, и там что-то понажимать.
лучший подарок женщине-программисту

Последний раз редактировалось chandrasecar; 27.11.2008 в 11:59.
chandrasecar вне форума Ответить с цитированием
Старый 27.11.2008, 16:12   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от chandrasecar Посмотреть сообщение
theHook:=SetWindowsHookEx(wh_keyboa rd,HOOK,HInstan ce,0);
Так хук не устанавливается, проверял. Да и вообще, theHook, это переменная которая сохраняет номер хука, то значение которое возвращает ф-ция SetWindowsHookEx.
это значение и есть хендл хука, его надо передать в функцию UnhookWindowsHookEx чтобы его снять.


Цитата:
Сообщение от chandrasecar Посмотреть сообщение
Да и потом, хук у меня устанавливается и снимается, но плохо. Чтобы снялся, нужно перейти на окно какой-то др. программы, окно программы должно стать неактивным, и там что-то понажимать.
ну это наверно уже глюки реализации....
rpy3uH вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
симуляция нажатий клавиш 4321 Общие вопросы Delphi 14 23.10.2008 23:18
Иммитация нажатий клавиш клавиатуры chandrasecar Win Api 5 11.10.2008 12:16
отслеживание нажатий клавиш Артэс Win Api 6 14.06.2008 20:02
Перехват нажатых клавиш AidarBik Общие вопросы Delphi 2 21.06.2007 20:11
Перехват и подмена кодов клавиш чужого окна Hedgehog Безопасность, Шифрование 3 23.04.2007 16:05