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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2016, 15:48   #1
Kovalchuk.Dmytro
 
Регистрация: 16.01.2015
Сообщений: 7
Вопрос Активировать приложение после нажатие горячей клавиши

Доброго времени суток! Я пишу приложение, в котором будет строка, в которую я буду вводить команды и по нажатию на "ентер", будут происходить заранне записаное действие. Само приложение запускается, затем я тераяю фокус приложения, так как работаю в других. Затем я нажимаю Ф6(посредством хука ловлю). и приложение должно получить фокус(строка фокус ввода соответсвенно). Чего у меня не получается, так что же нужно сделать???

Вот листинг кода:


Код:
unit uCommand;//Само приложение

interface

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

type
  TfrmCommand = class(TForm)
    edtCommand: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    procedure WMAPP100(var Msg: TMessage); message WM_APP+$100;
  end;

var
  frmCommand: TfrmCommand;

procedure SetHook(); external 'FAHook.dll';
procedure UnSetHook(); external 'FAHook.dll';  
  
implementation

{$R *.dfm}

procedure TfrmCommand.FormCreate(Sender: TObject);
begin
  SetHook;
end;

procedure TfrmCommand.FormDestroy(Sender: TObject);
begin
  UnSetHook;
end;

procedure TfrmCommand.WMAPP100(var Msg: TMessage);
begin
  //когда F6, попадет в ловушку нужно активировать снова прилодение, иначе ничего не делать 
end;

end.

Код:
library FAHook;//библиотека с отловом
 
uses
  Windows,
  Messages;

type
  KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: DWORD;
  end;
  PBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
 
const
  WH_KEYBOARD_LL: Integer = 13;
 
var
  hCallWndProc: HHOOK = 0;

function LowLevelKeyboardProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if code>=0 then
  begin
    if (wParam=WM_KEYDOWN) then
      case PBDLLHOOKSTRUCT(lParam).vkCode of
        VK_F6: SendMessage(FindWindow('TfrmCommand', 'frmCommand'), WM_APP+$100, 0, 0);
      end;
  end;
  Result:=CallNextHookEx(0, code, wParam, lParam)
end;
 
procedure SetHook();
begin
  hCallWndProc:=SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, HInstance, 0);
end;
 
procedure UnSetHook();
begin
  if hCallWndProc<>0 then UnhookWindowsHookEx(hCallWndProc);
end;
 
exports
  SetHook, UnSetHook;
 
begin
end.
Kovalchuk.Dmytro вне форума Ответить с цитированием
Старый 09.02.2016, 15:58   #2
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Зачем хук? Почему не так?
Код:
if not RegisterHotkey(Handle, 1, 0, VK_F6) then
ShowMessage('Ошибка регистрации горячей клавиши!');
Iron Monk вне форума Ответить с цитированием
Старый 09.02.2016, 21:08   #3
Kovalchuk.Dmytro
 
Регистрация: 16.01.2015
Сообщений: 7
Сообщение

В планах реализовать свертываемость в трей, а там данный способ не сработает...

Цитата:
Сообщение от Iron Monk Посмотреть сообщение
Зачем хук? Почему не так?
Код:
if not RegisterHotkey(Handle, 1, 0, VK_F6) then
ShowMessage('Ошибка регистрации горячей клавиши!');
Kovalchuk.Dmytro вне форума Ответить с цитированием
Старый 09.02.2016, 21:18   #4
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от Kovalchuk.Dmytro Посмотреть сообщение
В планах реализовать свертываемость в трей, а там данный способ не сработает...
С какой печали? Всё прекрасно работает.
Iron Monk вне форума Ответить с цитированием
Старый 10.02.2016, 16:07   #5
Kovalchuk.Dmytro
 
Регистрация: 16.01.2015
Сообщений: 7
Сообщение

Цитата:
Сообщение от Iron Monk Посмотреть сообщение
С какой печали? Всё прекрасно работает.
Нужно протестить, может я и ошибся...
Kovalchuk.Dmytro вне форума Ответить с цитированием
Старый 10.02.2016, 18:43   #6
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от Kovalchuk.Dmytro Посмотреть сообщение
Нужно протестить, может я и ошибся...
Нужно будет - даже по памяти, без отладки. код наберу...
Iron Monk вне форума Ответить с цитированием
Старый 13.02.2016, 20:57   #7
Kovalchuk.Dmytro
 
Регистрация: 16.01.2015
Сообщений: 7
Радость

Все разобрался спасибо, вот код, может кому на будущее...
Код:
unit uCommand;

interface

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

type
  TfrmCommand = class(TForm)
    edtCommand: TEdit;
    tray: TTrayIcon;
    TrayMenu: TPopupMenu;
    nExit: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure edtCommandChange(Sender: TObject);
    procedure nExitClick(Sender: TObject);
  private
    procedure OnHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmCommand: TfrmCommand;

implementation

{$R *.dfm}

procedure TfrmCommand.edtCommandChange(Sender: TObject);
begin
 if edtCommand.Text='~q' then frmCommand.Hide;
end;

procedure TfrmCommand.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnregisterHotKey(Handle, 1); // снятие регистрации
end;

procedure TfrmCommand.FormCreate(Sender: TObject);
begin
  RegisterHotKey(Handle, 1, MOD_Control+MOD_Shift, Ord('U'));
end;

procedure TfrmCommand.nExitClick(Sender: TObject);
begin
  frmCommand.Close;
end;

procedure TfrmCommand.OnHotKey(var Msg: TWMHotKey);
begin
   inherited;
   frmCommand.Show; frmCommand.SetFocus;
end;

end.
Kovalchuk.Dmytro вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание горячей клавиши для отображения окна xrenomx Общие вопросы Delphi 3 24.07.2012 12:30
Как выйти из цикла по нажатию горячей клавиши? suslik_ Помощь студентам 2 06.07.2011 16:20
Долгое нажатие клавиши в KeyDown как одно нажатие marina15056 Общие вопросы Delphi 7 16.08.2009 00:22
Как активировать чужое приложение Hintman Win Api 3 30.04.2007 16:24
Создание системной горячей клавиши Seqular Общие вопросы Delphi 8 17.02.2007 21:12