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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регистрация горчих клавиш, которые уже зарегистрированы 
:(
    Опции темы
Domoffou
Дата 28.10.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте.
Программа весит в трее и по спец. комбинации клавиш делает что-нибудь полезное.
Регистрирую клавиши примерно так (из ДРКБ):
Код

RegisterHotKey(form1.Handle,123,mod_control,vk_f7);

проблема в том, что если эти клавиши уже зарегистрированы на компьютере, к примеру, аналогичной программой на дельфи,
то вторая программа уже не реагирует.
Каким образом можно это исправить?
неужели ставить хук на клавиатуру?
PM MAIL ICQ   Вверх
Coder
Дата 28.10.2008, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Domoffou, есть обратная функция UnregisterHotKey(), НО для ее использования, как минимум, нужно знать идентификатор удаляемой Hot key.
PM MAIL   Вверх
Domoffou
Дата 29.10.2008, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Coder @ 28.10.2008,  02:57)
Domoffou, есть обратная функция UnregisterHotKey(), НО для ее использования, как минимум, нужно знать идентификатор удаляемой Hot key.

Вот кусочек функции, который занимется регистрацией горячих клавиш:

Код

unregisterhotkey(GlobalData^.MyAppWnd,0);
registerhotkey(GlobalData^.MyAppWnd,0,modifiers,thekey);


И все бы ничего, да вот на некоторых компьютерах встречаются ошибки при регистрации горячих клавиш (программа просто не отвечает на них).
PM MAIL ICQ   Вверх
Coder
Дата 29.10.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Domoffou, потому что они не регистрируются. unregisterhotkey(GlobalData^.MyAppWnd,0) - ты убиваешь горячую клавишу, у которой id=0 и которая закреплена за твоим приложением. Нужно указать правильные параметры чтобы убить хот кей другого приложения.
PM MAIL   Вверх
tHE_EGOiSTE
Дата 30.10.2008, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Domoffou, попробуй так. используется компонент THotKey
Код

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

type
  TForm1 = class(TForm)
    HotKey1: THotKey;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    Hotkey_id : Integer;
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// WM_HOTKEY Hotkey Handler
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = Hotkey_id then
    ShowMessage('Hotkey empfangen');
end;

// Transform TShortCut to use for RegisterHotKey
procedure ShortCutToHotKey(HotKey: TShortCut; var Key : Word; var Modifiers: Uint);
var
  Shift: TShiftState;
begin
  ShortCutToKey(HotKey, Key, Shift);
  Modifiers := 0;
  if (ssShift in Shift) then
  Modifiers := Modifiers or MOD_SHIFT;
  if (ssAlt in Shift) then
  Modifiers := Modifiers or MOD_ALT;
  if (ssCtrl in Shift) then
  Modifiers := Modifiers or MOD_CONTROL;
end;

// Register Hotkey
procedure TForm1.Button1Click(Sender: TObject);
var
  Key : Word;
  Modifiers: UINT;
begin
  ShortCutToHotKey(HotKey1.HotKey, Key, Modifiers);
  Hotkey_id := GlobalAddAtom('MyHotKey_1');
  RegisterHotKey(Handle, Hotkey_id, Modifiers, Key);
end;

// Remove Hotkey
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnRegisterHotKey(Handle, Hotkey_id);
  GlobalDeleteAtom(Hotkey_id);
end;

PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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