IPB
ЛогинПароль:

> Контрол Hot Key
Bokul
сообщение 24.07.2007 21:24
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Возникли проблемы. Ситуация такова: при создании главного окна я связываю с ним комбинацию горячих клавиш (RegisterHotKey), с которой ассоциирую идентификатор HotKeyTId. Но позже, я предоставляю юзеру возможность, в случае необходимости, изменить комбинацию, использую Hot Key контрол, создаваемого на отдельном PopUp окне. Когда ввод Hot Keys закончен, пользователю необходимо подтвердить его нажатием на кнопку (еще один контрол окна PopUp), после чего оконная функция PopUp'a считывает ввод Hot Key контрола, посылая ему сообщение HKM_GETHOTKEY. В ответ я получаю слово (Word), в котором хранятся флаги специальных клавиш (HiWord(word)), а также код виртуальной клавиши (LoWord(Word)), введенных юзером. Это слово я посылаю главному окну, которое, в свою очередь, снимает предыдущею комбинацию горячих клавиш с HotKeyTId (UnregisterHotKey ) и ставит новую, считанную с контрола. Проблема в том, что HiWord(word)) всегда возвращает 0... Из-за чего у меня возникает сомнение что HKM_GETHOTKEY сообщения корректно, в моем случае, и что вместо строки с Hot Key контрола оно возвращает комбинацию горячих клавиш, при которых этот контрол будет активен. Так ли это?

Сообщение отредактировано: Bokul - 24.07.2007 21:44


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Bokul
сообщение 25.07.2007 1:03
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Если не брать во внимание PopUp окно, а заменить его нормальным родительским, то это выглядит примерно так:

{$mode ObjFpc}
uses windows;
Const MainWndClass='MainWindowClass';
      HotKeyId=$2;
      HotKeyControlId=$5;
      ButtonControlId=$6;
      Wm_ChangeHotKeys=Wm_User+2;
var  MainWnd,HotKeysWnd,ButtonWnd:hWnd;
     HotKeysFlags,HotKeysLetter:word;
     buf:word;
function MainProc(Wnd:hWnd; Msg:cardinal; wparam,lparam:longint):longint; stdcall;
begin
     result:=0;
     case Msg of
          Wm_Create:begin//создаем кнопку и HotKey контрол
                         HotKeysWnd:=CreateWindowEx(0,HotKey_Class,'Hot Keys',
                                                    Ws_Child or Ws_Visible,
                                                    2,5,
                                                    150,
                                                    20,
                                                    Wnd,
                                                    HotKeyControlId,
                                                    system.mainInstance,
                                                    nil);
                         ButtonWnd:=CreateWindowEx(0,'Button','Change',
                                                   Ws_Child or Ws_Visible,
                                                   2,35,
                                                   70,
                                                   20,
                                                   Wnd,
                                                   ButtonControlId,
                                                   system.mainInstance,
                                                   nil);
                         //почему-то перестало работать.
                         SendMessage(HotKeysWnd,HKM_SetHotKey,MakeWParam(HotKeysLetter,HotKeysFlags),0);
                   end;
          Wm_Destroy:begin
                          PostQuitMessage(0);
                     end;
          Wm_HotKey:case wParam of//если нас вызывает через горячие клавиши, то...
                         HotKeyId: MessageBox(0,PChar('Main function'),PChar('Hot Keys!!!'),Mb_Ok);
                    end;
          Wm_Command: case LoWord(wParam) of
                           ButtonControlId:case HiWord(wParam) of//нажали на кнопку - сообщаем
                                                Bn_Clicked:begin
                                                                buf:=SendMessage(HotKeysWnd,HKM_GetHotKey,0,0);
                                                                if buf=0 then writeln('Error');
                                                                writeln('Flags:  ',HiWord(buf));//почему 0?
                                                                writeln('Letter: ',LoWord(buf),' = ',chr(LoWord(buf)));
                                                                SendMessage(Wnd,Wm_ChangeHotKeys,buf,0);
                                                           end;
                                           end;
                      end;
           Wm_ChangeHotKeys:begin//меняем Hot Keys...
                                writeln('Flags Received:  ',HiWord(wParam));//почему 0?
                                writeln('Letter Received: ',LoWord(wParam),' = ',chr(LoWord(wParam)));
                                if not(UnregisterHotKey(wnd,HotKeyId)) then
                                   writeln('Hot key unregistering error');
                                HotKeysFlags:=HiWord(wParam);
                                HotKeysLetter:=LoWord(wParam);
                                if not(RegisterHotKey(Wnd,HotKeyId,HotKeysFlags,HotKeysLetter)) then
                                   writeln('Cannot register new keys combination');
                                MessageBox(0,PChar('Receive'),PChar('Message was received'),Mb_Ok);
                           end;
           else result:=DefWindowProc(Wnd,Msg,wparam,lparam);
     end;
end;

function RegisterMainWndClass(ClassName:PChar):boolean;
var WndClass:PWndClassEx;
begin
 WndClass:=new(PWndClassEx);
  with WndClass^ do
       begin
            cbSize:=sizeof(WndClassEx);
            style := CS_DBLCLKS or CS_HREDRAW or
                     CS_OWNDC or CS_VREDRAW or Cs_ParentDc;
            LpfnWndProc:=@MainProc;
            cbClsExtra:=0;
            cbWndExtra:=0;
            hInstance:=System.HInstance;
            hIcon:=LoadIcon(0,Idi_Asterisk);
            hCursor:=LoadCursor(0,Idc_Arrow);
            hbrBackground:=Color_BtnFace+1;
            lpszMenuName:=nil;
            lpszClassName:=ClassName;
            hIconSm:=0;
       end;
  result:=RegisterClassEx(WndClass)<>0;
end;

function CreateMainWnd(ClassName:PChar):hWnd;
begin
     result:=CreateWindowEx(WS_EX_APPWINDOW,
             ClassName,
             '',
             Ws_Border or Ws_Caption or Ws_ClipCHildren or
             Ws_OverlappedWindow  or Ws_SizeBox or
             Ws_Visible,
             CW_USEDEFAULT, CW_USEDEFAULT,
             200, 130,
             0,
             0,
             HInstance,
             nil
             );
     HotKeysFlags:=Mod_Control;
     HotKeysLetter:=ord('L');
     writeln('Init Flags:  ',HotKeysFLags);
     writeln('Init Letter: ',HotKeysLetter);
     writeln;
     RegisterHotKey(result,HotKeyId,HotKeysFlags,HotKeysLetter);
end;

var Msg:TMsg;
begin
  RegisterMainWndClass(MainWndClass);
  MainWnd:=CreateMainWnd(MainWndClass);
  UpdateWindow(MainWnd);
  ShowWindow(MainWnd,Sw_ShowNa);
  while GetMessage(Msg,0,0,0) do begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
  end;
end.

 


Сообщение отредактировано: volvo - 5.04.2010 13:14


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Bokul   Контрол Hot Key   24.07.2007 21:24
Bokul   В случае необходимости могу предоставит код...   24.07.2007 21:49
Bokul   Если не брать во внимание PopUp окно, а заменить ...   25.07.2007 1:03
volvo   А что ты ожидал, что к тебе вернется, при таком оп...   25.07.2007 1:04
Bokul   Я выразился не правильно, на самом деле я читаю вс...   25.07.2007 1:07
volvo   Кстати, проблема у тебя может быть еще в том, что ...   25.07.2007 1:08
Bokul   Спасибо, действительно ошибка, но после исправлени...   25.07.2007 1:11
volvo   Так... Моя ошибка - надо все-таки работать при Buf...   25.07.2007 1:34
Bokul   Премного благодарен! :good:   25.07.2007 1:40
Bokul   Потестил... рабочии комбинации только Сtrl'a +...   25.07.2007 2:25
volvo   Проблема в следующем: описаны константы вот так ...   25.07.2007 8:26
volvo   Так, ну все понятно... Какой-то умник решил, что в...   25.07.2007 8:50
Bokul   В принципе я разобрался, но из-за неопытности с ра...   25.07.2007 18:43
volvo   :yes2: Посмотрел здесь: HKM_GETHOTKEY Message, ...   25.07.2007 18:55
Bokul   Бессмысленный смысл путаницы стал ясен: этим разра...   26.07.2007 5:17
volvo   А зачем? Для экономии места, что-ли? :) Теоретиче...   26.07.2007 8:16
Bokul   Ради этого и спросил.. :) А будит ли так? Теоре...   26.07.2007 18:10
volvo   Практически? Не уверен, что делать вот так: var mo...   26.07.2007 19:03


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 31.07.2025 5:08
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"