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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2007, 11:13   #11
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Вопрос

Ни у кого ни каких идей?У меня тут возникла, вот если бы разобрать как-то клавиши указанные в компоненте HOTKEY под регистрацию клавишь средствами function RegisterHotKey(hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL;.Думаю может таким способом можно зарегить в системе свои ХотКеи. Ждём предложений и надеюсь что удастся решить эту проблему.
Alter вне форума Ответить с цитированием
Старый 10.10.2007, 12:00   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

[QUOTE=Alter;39359если бы разобрать как-то клавиши указанные в компоненте HOTKEY[/QUOTE]
Ну эт не проблема :

procedure TForm1.HotKey1Change(Sender: TObject);
var chars:integer;modif,md:integer;
begin
chars:=HotKey1.HotKey and dword(-1);
modif:=HotKey1.HotKey shr 8;
caption:='';
if (modif and 32)>1 then begin caption:='Shift';end;
if (modif and 64)>1 then begin caption:=caption+' Ctrl';end;
if (modif and 128)>1 then begin caption:=caption+' alt';end;
caption:=caption+' '+chr(chars);
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.11.2009, 03:15   #13
oxy-fox
Пользователь
 
Аватар для oxy-fox
 
Регистрация: 24.02.2009
Сообщений: 11
Радость

Можно сделать так:
Код:
private
    { Private declarations }
    HotKeyContacts:TShortCut;
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
 public
    { Public declarations }
    function RegHotKey(HotKey:TShortCut; a:Integer):boolean;

implementation

function TForm1.RegHotKey(HotKey:TShortCut; a:Integer):boolean;
var
 TheKey:Word;
 TheShiftState:TShiftState;
 Modifiers:Cardinal;
begin
 UnRegisterHotKey(Handle,a);
 HotKeyContacts:=HotKey;
 ShortCutToKey(HotKeyContacts, TheKey, TheShiftState);
 Modifiers:=0;
 if ssAlt in TheShiftState then Modifiers:=Modifiers or MOD_ALT;
 if ssShift in TheShiftState then Modifiers:=Modifiers or MOD_SHIFT;
 if ssCtrl in TheShiftState then Modifiers:=Modifiers or MOD_CONTROL;
 Result:=RegisterHotkey(Handle,a,Modifiers,TheKey);
end;

procedure TForm1.WMHotKey(var Msg:TWMHotKey);
begin
  Beep;
  case Msg.HotKey of
    0: Button1.Click;
    1: Button2.Click;
    2: Button3.Click;
    3: Button4.Click;
    4: Button5.Click;
    5: Button6.Click;
    6: Button7.Click;
    7: Button8.Click;
    8: Button9.Click;
    9: Button10.Click;
    10: Button11.Click;
    11: Button12.Click;
   end;

end;
И на нажатие кнопки или изменение поля Хот Кей ставим следующее:
Код:
RegHotKey(RzHotKeyEdit1.HotKey,0);
Скопировал то, что у меня в программе, но каждый может сделать под себя..
oxy-fox вне форума Ответить с цитированием
Старый 16.11.2009, 09:34   #14
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

могу предложить еще один способ регистрации глобальных клавиш путем выбора их например в компоненте (фактически можно в любом) - stringgrid... становимся на n-ю ячейку, нажимаем комбинацию и вуаля...
Код:

var sg1: tstringgrid;
...
//--- HOTKEY
function strtohotkey(key:string; p: boolean):integer;
begin
 result:= 0;
 if (key = 'Нет')or(key = '') then exit;
 
 if p then begin
  if pos('Alt',key)>0   then result:= 1;
  if pos('Ctrl',key)>0  then result:= 2;
  if pos('Shift',key)>0 then result:= 4
 end else result:= ord(key[length(key)])
end;

function hotkeytostr(Key: Word; shift: TShiftState): string;
begin
 result:= '';
 if (ssctrl in shift)  then result:= 'Ctrl';
 if (ssalt in shift)   then result:= 'Alt';
 if (ssshift in shift) then result:= 'Shift';
 //
 if (key<>16)and(key<>17)and(key<>18) then
 if result = '' then result:= chr(key)
  else result:= result + ' + ' + chr(key);

 if (key = vk_delete)or(result='Ctrl')or(result='Alt')or(result='Shift') then
  result:= 'Нет'
end;

procedure Tdllg1.gl_hook(key1,key2: integer; p: boolean);
var i: integer;
begin
 if p then begin //горячие клавиши-
  setlength(id,length(id)+1);
  id[length(id)-1]:= GlobalAddAtom(pchar('hotkey' + inttostr(length(id)-1)));
  RegisterHotKey(handle,id[length(id)-1],key1,key2);
 end else begin //анрег- горячих клавиш
  for i:=0 to length(id)-1 do UnRegisterHotKey(handle,id[i]);
  setlength(id,1);
 end
end;

procedure Tdllg1.ghotkey(var msg:TMessage);
var i,j,k: integer;
begin
 if not Visible then
 //
 for i:= 1 to sg1.RowCount-1 do
  if (sg1.Cells[4,i]<>'Нет')and(sg1.Cells[4,i]<>'') then begin

   if (msg.LParamLo = strtohotkey(sg1.Cells[4,i],true))and
      (msg.LParamHi = strtohotkey(sg1.Cells[4,i],false)) then begin
       //поиск команды-
       k:=0;
       for j:=0 to cmd.Items.Count-1 do
        if cmd.Items[j]= sg1.Cells[0,i] then begin k:=j;break;end;
       //проверка на выполнение-
       if fileexists(sg1.Cells[0,i]) then begin path_pr:= sg1.Cells[0,i]; k:= 58 end;
       if sg1.Cells[0,i][1] = '>'      then begin path_pr:= copy(sg1.Cells[0,i],3,length(sg1.Cells[0,i])); k:= 59 end;
       if k<>0 then vid.icc(k) // передача номер команды дальше-
   end
  end
end;

// назначение-
procedure Tdllg1.sg1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var i: integer;
begin
  sg1.Cells[4, selc]:= hotkeytostr(Key,shift);
  //
  gl_hook(0,0,false);
  for i:= 1 to sg1.RowCount-1 do
   if (sg1.Cells[4,i]<>'Нет')and(sg1.Cells[4,i]<>'') then
    gl_hook(strtohotkey(sg1.Cells[4,i],true),
            strtohotkey(sg1.Cells[4,i],false),
            true)
end;

procedure Tdllg1.sg1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
var R: TRect;
begin
 selc:= ARow // там где встали
end;
//=======================

// загрузка команд-
procedure Tdllg1.FormCreate(Sender: TObject);
var i: integer;
begin
  gl_hook(0,0,false);
  for i:= 1 to sg1.RowCount-1 do
   if (sg1.Cells[4,i]<>'Нет')and(sg1.Cells[4,i]<>'') then
    gl_hook(strtohotkey(sg1.Cells[4,i],true),
            strtohotkey(sg1.Cells[4,i],false),
            true)
end;

procedure Tdllg1.FormDestroy(Sender: TObject);
begin
 gl_hook(0,0,false);

  //планировщик- // тут сохранение горячих клавиш совмещено с планировщиком, так что можно упростить
  delp('sh'); 
  for i:=1 to sg1.RowCount-1 do begin
   s:= '';
   for j:=0 to sg1.ColCount-1 do s:=s+'#'+sg1.Cells[j,i];
   if sg1.Cells[0,i]<>'' then begin
    ini.WriteInteger('sh','count',i);
    ini.WriteString('sh', inttostr(i), s)
   end
  end

end;
procedure tdllg1.delp(name: string);
begin
 ini.EraseSection(name);
 ini.UpdateFile
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 16.11.2009 в 09:37.
raxp вне форума Ответить с цитированием
Старый 07.04.2012, 23:52   #15
hacknet
Форумчанин
 
Регистрация: 11.11.2008
Сообщений: 177
По умолчанию

мужики кому не сложно напишите исходник, суть которого заключается при нажатии не важно каких клавишь(2-3)таймер останавливался и рри нажатии других запускался! спасибо
p.s + в репу
hacknet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HotKey Simply-Art Win Api 16 15.08.2008 12:10
KOL HotKey Simply-Art Помощь студентам 6 13.08.2008 11:01
Какой компонент использовать? XPAiN БД в Delphi 3 05.05.2008 08:45
Потомок от HotKey Alter Компоненты Delphi 4 03.01.2008 15:47
как зарегестрировать горячую клавишу с помощью HotKey GAGARIN-NEW Компоненты Delphi 3 09.11.2007 08:22