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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2013, 12:41   #11
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Использовать Low-Lovel hook, вместо WH_KEYBOARD использовать WH_KEYBOARD_LL. Callback измениться и гемороя прибавится, но работать будет.
Человек_Борща вне форума Ответить с цитированием
Старый 27.09.2013, 16:06   #12
AndXor
Пользователь
 
Регистрация: 02.10.2012
Сообщений: 16
По умолчанию

Нашёл вот такой интересный код отлова клавиши без длл, но что-то он не во всех приложениях хочет работать(( Ну тоесть я сворачию свою программу и хочу нажать PrintScreen и далеко не всегда срабатывает. Например когда голый рабочий стол то работает, а когда открыт Total Commander или AkelPad то работать не хочет. В чём может быть косяк или этот код не подходит?(
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


  const
 WH_KEYBOARD_LL = 13;
 LLKHF_EXTENDED = KF_EXTENDED shr 8;
 LLKHF_INJECTED = $00000010;
 LLKHF_ALTDOWN = KF_ALTDOWN shr 8;
 LLKHF_UP = KF_UP shr 8;
type
 tagKBDLLHOOKSTRUCT = packed record
   vkCode : DWord;
   scanCode : DWord;
   flags : DWord;
   time : DWord;
   dwExtraInfo : PDWord;
 end;
 TKBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
 PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;

var
  Form1: TForm1;
    hook: HHOOK;

implementation

{$R *.dfm}
function LowLevelKeyboardProc(nCode :Longint; awParam: WParam; alParam:
LParam): nativeint; stdcall;
var
 p: PKBDLLHOOKSTRUCT;
begin
  if (nCode = HC_ACTION) then
     case (awParam) of
       WM_KEYDOWN, WM_SYSKEYDOWN:
        begin
          p := PKBDLLHOOKSTRUCT(alParam);
          if (p.vkCode = VK_SNAPSHOT) then
            ShowMessage('Хук сработал');;
        end;
     end;
  Result := CallNextHookEx(0, nCode, awParam, alParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if hook=0 then
    hook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
end;

end.
AndXor вне форума Ответить с цитированием
Старый 30.09.2013, 16:58   #13
AndXor
Пользователь
 
Регистрация: 02.10.2012
Сообщений: 16
По умолчанию

Народ...Посмотрите код, может он всё таки пригодный но тут где-то косяк?
AndXor вне форума Ответить с цитированием
Старый 30.09.2013, 18:19   #14
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
но тут где-то косяк?
Угу, один супер-маленький.
Хуки, особенно глобальные, живут исключительно в DLL.
Человек_Борща вне форума Ответить с цитированием
Старый 30.09.2013, 22:37   #15
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Хуки, особенно глобальные, живут исключительно в DLL.
с чего это?
eval вне форума Ответить с цитированием
Старый 30.09.2013, 22:46   #16
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Хуки, особенно глобальные, живут исключительно в DLL.
Кроме Low-Level хуков.
northener вне форума Ответить с цитированием
Старый 30.09.2013, 22:51   #17
AndXor
Пользователь
 
Регистрация: 02.10.2012
Сообщений: 16
По умолчанию

Блин код вроде рабочий, но не во всех приложениях работает. В чём косяк? Или может есть готовые решения.... или покажите хотя бы пример из чего можно сделать рабочий вариант.... а то получается что делаю глобальный хук DLL, callback работать не хочет, делаю без DLL не хочет работать во всех приложениях. ;(
AndXor вне форума Ответить с цитированием
Старый 01.10.2013, 06:23   #18
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Попробуйте так, без DLL:
Код:
SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
Silver_S вне форума Ответить с цитированием
Старый 01.10.2013, 15:33   #19
AndXor
Пользователь
 
Регистрация: 02.10.2012
Сообщений: 16
По умолчанию

Всё тоже самое, не хочет он работать в некоторых приложениях.
AndXor вне форума Ответить с цитированием
Старый 01.10.2013, 15:59   #20
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

В каких например?
eval вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать че-нибудь в DLL / Из DLL прочитать переменную EXE WhiskasTM Общие вопросы Delphi 9 02.08.2012 13:33
Гибрид 16 (DLL) и 32 (EXE) Alex Cones Общие вопросы Delphi 2 21.02.2010 09:23
Запуск Load.dll (бывшая Load.exe) в дереве проц-ов, Как запустить прогой на C# .dll-ку kapustin Общие вопросы .NET 10 23.09.2009 22:20
Соединение DLL и EXE Alex Cones Общие вопросы Delphi 2 19.04.2009 16:20