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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WM_HOTKEY в Сервисе 
V
    Опции темы
hitter
Дата 27.3.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как реализовать "горячии" клавиши в сервисе. smile
Думаю что обработка нажатия на клавиши, должна быть через глобальный хук. smile
Так какой тип хука надо ставить на сообщение WM_HOTKEY?
Может я не прав? А тогда как? smile
PM MAIL   Вверх
_hunter
Дата 27.3.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



Цитата

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.



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
hitter
Дата 27.3.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(_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

PM MAIL   Вверх
_hunter
Дата 27.3.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



зарегистрируй идентификатор функцией GlobalAddAtom


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
hitter
Дата 28.3.2006, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот мой пример - неработает.
Код

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
PM MAIL   Вверх
_hunter
Дата 28.3.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



ты не зарегистрировал hot-key


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Voyager
Дата 28.3.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Возможно этот пример поможет:
http://voyager.alfamoon.com/forum/topic.ph...m=3&topic=4
Там есть пример как работать с горячими клавишами средствами WinAPI.
PM   Вверх
hitter
Дата 28.3.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот реализация - неоптимизированая.
Тестовая версия проги.
Как убрать видимое окно?
PM MAIL   Вверх
_hunter
Дата 28.3.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



эээ... не показывать его?..
или можно 7-м параметром HWND_MESSAGE передать...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
hitter
Дата 28.3.2006, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

PM MAIL   Вверх
_hunter
Дата 29.3.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



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

йа йа.

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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
hitter
Дата 29.3.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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


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

Ясно!

PM MAIL   Вверх
Voyager
Дата 29.3.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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 выходим из программы.

Это сообщение отредактировал(а) Voyager - 29.3.2006, 21:08
PM   Вверх
hitter
Дата 29.3.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Voyager, ОГРОМНОЕ СПАСИБО. Прогу написал - все работает!
Как будет у меня 100 постов два перехода по
ссылке обеспечены!
СПАСИБО! СПАСИБО! smile smile
Если что я еще пискану в приват!

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

Это сообщение отредактировал(а) hitter - 29.3.2006, 20:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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