На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> hoor
    Подскажите, пожалуйста, как правиьно установить глобальный хук на выключение/перезагрузку винды? Как правильно вызывать SetWindowsHookEx? Я пробуюделать так :
    SetWindowsHookEx(WH_HARDWARE,@HookProc,HInstance,0). Но мне кажется, что первый параметр надо брать другим, каким?

    *****

    А дальше в dll-ке:
    ExpandedWrap disabled
       
      function HookProc(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt; stdcall;
      var Msg:TMessage;
      begin
        if Code=HC_ACTION then
        case TMsg(Pointer(LParam)^).Message of
          WM_QUIT: Beep(1000,300);
        else Result:=CallNextHookEx(SysHook,Code,WParam,LParam);
        end;
      end;

    Что в этой функции неправильно?
      почитай Фак там всё расписано
        Red Wind, а зачем хук?
        Отловить перезагрузку?
          2 Andrey_Kun :
          В FAQ есть, но не совсем то. Я не знаю какое сообщение отлавливать. Пробовал WM_QUERYENDSESSION, WM_QUIT, WM_POWER, но из этого ниченго не работает. Но может я просто указываю неправильные значения в SetWindowsHookEx? Какую константу надо задавать первым параметром в моём случае?

          ****

          2 Song :
          Мне надо чтобы моя прога первой (из всех других программ) узнавала об том, что windows собирается выключаться, и в случае чего запрещала выключение.
            Red Wind, не обязательно первой. Лови WM_QUERYENDSESSION и верни результат "неправильный" (не помню я какое число, читай хэлп).
              Мне надо, чтобы именно первой. Пока очередь дойдёт до мой проги, все программы получившие WM_QUERYENDSESSION закроются, а мне нельзя этого допускать.
                Ну ок, тогда хук на WH_GETMESSAGE и лови WM_QUERYENDSESSION
                  Это не работает!!! Вот код:
                  ExpandedWrap disabled
                     
                    procedure SetHook; export; stdcall;
                    Begin
                      SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@HookProc,HInstance,0);
                    End;
                     
                    function HookProc(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt; stdcall;
                    begin
                      if Code=HC_ACTION then
                      case TMsg(Pointer(LParam)^).Message of
                        WM_QUERYENDSESSION :
                        begin
                          Beep(3000,300);
                          TMsg(Pointer(LParam)^).Message:=WM_NULL;
                        end
                      else Result:=CallNextHookEx(SysHook,Code,WParam,LParam);
                      end;
                    end;

                  Где здесь ошибка?
                  Сообщение отредактировано: Red Wind -
                    1) это dll ?
                    2) Ты должен вернуть Result:=0, но в tagMsg Result нет :(
                      1) В dll.
                      2) А TMsg(Pointer(LParam)^).Message:=WM_NULL не подходит?
                        Цитата
                        Red Wind, 23.05.04, 21:08
                        2) А TMsg(Pointer(LParam)^).Message:=WM_NULL не подходит?

                        Нет, так ты просто аннулируешь сообщение, а тебе надо сообщение оставить но вернуть отрицательный результат.
                          И что мне сделать?
                            И вообще приведённым мной кодом ловятся не все сообщения. Например реакции на WM_QUERYENDSESSION никакой. Почему?
                              Ловятся все.
                              Что значит
                              Цитата
                              Red Wind, 30.05.04, 14:27
                              реакции на WM_QUERYENDSESSION никакой

                              ?

                              И как связано реакция с тем что сообщение ловится или не ловится?
                                ExpandedWrap disabled
                                   
                                  ...
                                      WM_QUERYENDSESSION :
                                      begin
                                        Beep(3000,300);{!!!}
                                        TMsg(Pointer(LParam)^).Message:=WM_NULL;
                                      end
                                  ...

                                При перехвате сообщения должен пискнуть динамик. При других (почему-то не всех) сообщений beep происходит.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0570 ]   [ 15 queries used ]   [ Generated: 20.05.24, 09:38 GMT ]