Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > WM_HOTKEY в Сервисе


Автор: hitter 27.3.2006, 09:33
А как реализовать "горячии" клавиши в сервисе. smile
Думаю что обработка нажатия на клавиши, должна быть через глобальный хук. smile
Так какой тип хука надо ставить на сообщение WM_HOTKEY?
Может я не прав? А тогда как? smile

Автор: _hunter 27.3.2006, 10:56
Цитата

id
[in] Specifies the identifier of the hot key. No other hot key in the calling thread should have the same identifier. An application must specify a value in the range 0x0000 through 0xBFFF. A shared dynamic-link library (DLL) must specify a value in the range 0xC000 through 0xFFFF (the range returned by the GlobalAddAtom function). To avoid conflicts with hot-key identifiers defined by other shared DLLs, a DLL should use the GlobalAddAtom function to obtain the hot-key identifier.

Автор: hitter 27.3.2006, 13:21
Цитата(_hunter @ 27.3.2006, 14:56 Найти цитируемый пост)
id
[in] Specifies the identifier of the hot key. No other hot key in the calling thread should have the same identifier. An application must specify a value in the range 0x0000 through 0xBFFF. A shared dynamic-link library (DLL) must specify a value in the range 0xC000 through 0xFFFF (the range returned by the GlobalAddAtom function). To avoid conflicts with hot-key identifiers defined by other shared DLLs, a DLL should use the GlobalAddAtom function to obtain the hot-key identifier.

Я что-то не понимаю! smile

Автор: _hunter 27.3.2006, 13:35
зарегистрируй идентификатор функцией GlobalAddAtom

Автор: hitter 28.3.2006, 07:24
Вот мой пример - неработает.
Код

program Service;

uses
  Windows,
  WinSvc {, Forms},
  FUNC in 'FUNC.pas',
  messages,
  dialogs;

const
  AppName = 'WinMin';
var
  DispatchTable: SERVICE_TABLE_ENTRY;
  MyServiceStatus: SERVICE_STATUS;
  MyServiceStatusHandle: SERVICE_STATUS_HANDLE;
  Window : HWnd;
  Message : TMsg;
  WindowClass : TWndClass;
  id : integer;

procedure MyServiceCtrlHandler (Opcode: DWORD);
begin
case Opcode of
  SERVICE_CONTROL_PAUSE    :
   begin
   MyServiceStatus.dwCurrentState := SERVICE_PAUSED;
   end;
  SERVICE_CONTROL_CONTINUE :
   begin
   myServiceStatus.dwCurrentState := SERVICE_RUNNING;
   end;
  SERVICE_CONTROL_STOP     :
   begin
    MyServiceStatus.dwWin32ExitCode:=0;
    MyServiceStatus.dwCurrentState := SERVICE_STOPPED;
    MyServiceStatus.dwCheckPoint   :=0;
    MyServiceStatus.dwWaitHint     :=0;

    if not SetServiceStatus (MyServiceStatusHandle, MyServiceStatus) then
       begin
        Exit;
       end;
       exit;
    end;
  SERVICE_CONTROL_INTERROGATE :
  SetServiceStatus(MyServiceStatusHandle, MyServiceStatus);
 end;
 if not SetServiceStatus (MyServiceStatusHandle, MyServiceStatus)
  then begin
   Exit;
  end;
end;

function WindowProc (Window : HWnd; Message, WParam : Word; LParam : LongInt) : LongInt; stdcall;
begin
 WindowProc := 0;
 case Message of
      wm_Destroy :
                  begin
                   PostQuitMessage (0);
                   MyServiceStatus.dwCurrentState:=SERVICE_STOP_PENDING;
                   Exit;
                  end;
      WM_HOTKEY:
                  begin
                   showmessage('hotkey');
                  end;
 end;
 WindowProc := DefWindowProc (Window, Message, WParam, LParam);
end;

procedure MainFunction(argc: DWORD; var argv: array of PChar); stdcall;
var
 temp : string;
begin
  MyServiceStatus.dwServiceType := SERVICE_WIN32;
  MyServiceStatus.dwCurrentState := SERVICE_START_PENDING;
  MyServiceStatus.dwControlsAccepted := SERVICE_ACCEPT_STOP or SERVICE_ACCEPT_PAUSE_CONTINUE;
  MyServiceStatus.dwWin32ExitCode:= 0;
  MyServiceStatus.dwServiceSpecificExitCode:= 0;
  MyServiceStatus.dwCheckPoint:= 0;
  MyServiceStatus.dwWaitHint:= 0;
  MyServiceStatusHandle:= RegisterServiceCtrlHandler('OurService', @MyServiceCtrlHandler);
// Инициализация
   with WindowClass do
 begin
 Style := cs_HRedraw or cs_VRedraw;
 lpfnWndProc := @WindowProc;
 cbClsExtra := 0;
 cbWndExtra := 0;
 hInstance := 0;
 hIcon := LoadIcon (0, idi_Application);
 hCursor := LoadCursor (0, idc_Arrow);
 hbrBackground := GetStockObject (White_Brush);
 lpszMenuName := '';
 lpszClassName := AppName;
 end;

 If RegisterClass (WindowClass) = 0 then Halt (255);
    Window := CreateWindow(AppName,
                           'Win_Min',
                           ws_OverlappedWindow,
                           cw_UseDefault,
                           cw_UseDefault,
                           cw_UseDefault,
                           cw_UseDefault,
                           0,
                           0,
                           HInstance,
                           nil);
//---------------------------//
// Завершаем инициализацию, стартуем сервис
  MyServiceStatus.dwCurrentState:= SERVICE_RUNNING;
  MyServiceStatus.dwCheckPoint:= 0;
  MyServiceStatus.dwWaitHint:= 0;
  SetServiceStatus (MyServiceStatusHandle, MyServiceStatus);
  ShowWindow (Window, CmdShow);
  UpdateWindow (Window);
// Работа сервиса

  //----------------------------+
     while GetMessage (Message, 0, 0, 0) do
           begin
            TranslateMessage (Message);
             showmessage('fdsfsdfsd');//так, для примера!
            DispatchMessage (Message);
           end;
  //----------------------------+
  UnRegisterHotkey(Window,id);
end;
begin
  DispatchTable.lpServiceName:='Our service';
  DispatchTable.lpServiceProc:=@MainFunction;
  StartServiceCtrlDispatcher(DispatchTable);
end.

Что-то я не так зделал! smile smile smile

Автор: _hunter 28.3.2006, 10:55
ты не зарегистрировал hot-key

Автор: Voyager 28.3.2006, 12:11
Возможно этот пример поможет:
http://voyager.alfamoon.com/forum/topic.php?forum=3&topic=4
Там есть пример как работать с горячими клавишами средствами WinAPI.

Автор: hitter 28.3.2006, 15:08
Вот реализация - неоптимизированая.
http://hitter.nm.ru/files/
Как убрать видимое окно?

Автор: _hunter 28.3.2006, 15:47
эээ... не показывать его?..
или можно 7-м параметром HWND_MESSAGE передать...

Автор: hitter 28.3.2006, 20:10
_hunter
Цитата(_hunter @ 28.3.2006, 19:47 Найти цитируемый пост)
эээ... не показывать его?..
или можно 7-м параметром HWND_MESSAGE передать...

ду ю спеак инглиш или
что-то я не понимаю твоего ответа! smile
Мона по подробнее! smile

Автор: _hunter 29.3.2006, 10:37
Цитата(hitter @ 28.3.2006, 19:10 Найти цитируемый пост)
ду ю спеак инглиш

йа йа.

говорю медленнее... чтобы скрыть окно его достаточно не показать.
так же в функцию CreateWindow 7-м параметром можно передать HWND_MESSAGE

Автор: hitter 29.3.2006, 13:17
Цитата(_hunter @ 29.3.2006, 14:37 Найти цитируемый пост)
HWND_MESSAGE

Что за константа?


Цитата(_hunter @ 29.3.2006, 14:37 Найти цитируемый пост)
говорю медленнее... чтобы скрыть окно его достаточно не показать.

Ясно!

Автор: Voyager 29.3.2006, 16:52
Сделать программу с горячими клавишами без окна можно, вот набросал пример:
Код

program Hotkey;

uses
  Windows,
  Messages;

const
    HOTKEY1 = 111;
    HOTKEY2 = 112;

var
    mMsg: TMsg;

begin
    RegisterHotKey(0,HOTKEY1,mod_control,vk_f11);
    RegisterHotKey(0,HOTKEY2,mod_control,vk_f12);
    while GetMessage(mMsg, 0 , 0, 0) do
        begin
            TranslateMessage(mMsg);
            if (mMsg.message = WM_HOTKEY) then
                begin
                    If (loword(mMsg.wParam) = HOTKEY1) then
                        messagebox(0,'Нажата комбинация Ctrl+F11','Hotkey!',0)
                    else
                       If (loword(mMsg.wParam) = HOTKEY2) then break;
                end;
            DispatchMessage(mMsg);
        end;
    UnregisterHotKey(0, HOTKEY1);
    UnregisterHotKey(0, HOTKEY2);
    messagebox(0,'Программа завершила работу','End',0);
end.



По Ctrl+F12 выходим из программы.

Автор: hitter 29.3.2006, 20:47
Voyager, ОГРОМНОЕ СПАСИБО. Прогу написал - все работает!
Как будет у меня 100 постов два перехода по
http://forum.vingrad.ru/index.php?act=rep&CODE=01&mid=8615&f=85&t=89108&p=687450 обеспечены!
СПАСИБО! СПАСИБО! smile smile
Если что я еще пискану в приват!

Тему можно закрывать! smile smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)