На главную Наши проекты:
Журнал   ·   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
  
> хук на WH_GETMESSAGE
    Поставил хук на WH_GETMESSAGE
    Как узнать какие клавиши нажимались, если отлавливать сообщения WM_KEYUP,
      Вот фрагмент кода отлавливающего хоткеи при помощи этого хука, тут вроде всё понятно, если надо могу всю прогу выложить

      ExpandedWrap disabled
          function SetHook(WinHandle: HWND; MsgToSend: Integer): Boolean; stdcall;
        begin
          Result := False;
          if (MMFData = nil) and (MMFHandle = 0) then
          begin
            MMFHandle := CreateMMF(MMFName, SizeOf(TMMFData));
            if MMFHandle <> 0 then
            begin
              MMFData := MapMMF(MMFHandle);
              if MMFData <> nil then
              begin
                MMFData.WinHandle := WinHandle;
                MMFData.MsgToSend := MsgToSend;
                MMFData.NextHook := SetWindowsHookEx(WH_GETMESSAGE, MsgFilterFunc, HInstance, 0);
         
                if MMFData.NextHook = 0 then
                  UnMapAndCloseMMF
                else
                  Result := True;
              end
              else
              begin
                CloseMMF(MMFHandle);
                MMFHandle := 0;
              end;
            end;
          end;
        end;
        //----------------------------------------------------------
         
        function FreeHook: Boolean; stdcall;
        begin
          Result := False;
          if (MMFData <> nil) and (MMFHandle <> 0) then
            if UnHookWindowsHookEx(MMFData^.NextHook) then
              Result := UnMapAndCloseMMF;
        end;
        //----------------------------------------------------------
         
        function MsgFilterFunc(Code: Integer; wParam, lParam: Longint): Longint;
        var
          MMFHandle: THandle;
          MMFData: PMMFData;
          Kill: boolean;
        begin
          Result := 0;
          MMFHandle := OpenMMF(MMFName);
          if MMFHandle <> 0 then
          begin
            MMFData := MapMMF(MMFHandle);
            if MMFData <> nil then
            begin
              if (Code < 0) or (wParam = PM_NOREMOVE) then
                  Result := CallNextHookEx(MMFData.NextHook, Code, wParam, lParam)
              else
              begin
                Kill := False;
         
                { Example to disable all the start-Key combinations }
                case TPMsg(lParam)^.message of
                  WM_SYSCOMMAND: // The Win Start Key (or Ctrl+ESC)
                   if TPMsg(lParam)^.wParam = SC_TASKLIST then Kill := True;
         
                  WM_HOTKEY:
                    case ((TPMsg(lParam)^.lParam and $00FF0000) shr 16) of
                      VK_D,      // Win+D        ==> Desktop
                     VK_E,      // Win+E        ==> Explorer
                     VK_F,      // Win+F+(Ctrl) ==> Find:All (and Find: Computer)
                     VK_M,      // Win+M        ==> Minimize all
                     VK_R,      // Win+R        ==> Run program.
                     VK_F1,     // Win+F1       ==> Windows Help
                     VK_PAUSE:  // Win+Pause    ==> Windows system properties
                       Kill := True;
                    end;
                end;
                if Kill then TPMsg(lParam)^.message := WM_NULL;
                Result := CallNextHookEx(MMFData.NextHook, Code, wParam, lParam)
              end;
              UnMapMMF(MMFData);
            end;
            CloseMMF(MMFHandle);
          end;
        end;
        тут
        ExpandedWrap disabled
          MMFData.NextHook := SetWindowsHookEx(WH_GETMESSAGE, MsgFilterFunc, HInstance, 0);

        разве не так надо
        MMFData.NextHook := SetWindowsHookEx(WH_GETMESSAGE, @MsgFilterFunc, HInstance, 0);

        Добавлено
        У меня при установки хука WH_GETMESSAGE, через DLL нельзя удалить хук, если произойдут те события, которые там установлены..
        Сообщение отредактировано: koder -
          Вот полный исходник проги для перехвата хоткеев (кстати убрал от туда MMF без него тоже работает, да и разобраться в коде намного легче), у меня компилиться и нормально работает, и снимается тоже без проблем

          Насчёт "@" хз непомню (НА этом компе делфи нет), вроде бы должен быть, хотя не факт... Попробуй скомпилять исходник, который я дал там нет "@", но вроде компилиться, если нет то подставь и всё :)...
          Прикреплённый файлПрикреплённый файлsys.zip (31.29 Кбайт, скачиваний: 263)
            Здравствуйте!
            У меня не получается отловить событие WM_SYSCOMMAND и WM_CLOSE своего приложения, реализовать надо именно через ловушку, потому что потом надо будет переделать для "чужого" приложения, использую WH_GETMESSAGE. Бьюсь уже не первый час:(
            В аттаче исходники, подскажите пожалуйста, что я делаю не так.
            Заранее спасибо!
            Прикреплённый файлПрикреплённый файлSetHook.zip (3.42 Кбайт, скачиваний: 180)
              zsergey
              C этой темой все бьются не по одному часу..и дню. :D
                koder и zsergey Попробуйте поиск и фак, если не поможет, тогда пишите.
                  Цитата doom_mm @
                  кстати убрал от туда MMF без него тоже работает, да и разобраться в коде намного легче

                  лонгично, если софт не предназначен для Win9x
                  Цитата MSDN
                  hhk
                  [in] Windows 95/98/ME: Handle to the current hook. An application receives this handle as a result of a previous call to the SetWindowsHookEx function.
                  Windows NT/XP/2003: Ignored.
                    Цитата P.O.D @
                    koder и zsergey Попробуйте поиск и фак, если не поможет, тогда пишите.

                    Перед тем как писать сюда, я искал в Delphi Word, в "Кулибе" и на этом форуме... безрезультатно
                      zsergey, первое что попалось на глаза - ты ставишь локальный хук на свое приложение, а параметры указываешь как при установке глобального:
                      Цитата Unit1.pas
                      HANDL:=SetWindowsHookEx(WH_GETMESSAGE, @MsgFilterFunc, HInstance, 0);

                      надо так:
                      ExpandedWrap disabled
                          HANDL:=SetWindowsHookEx(WH_GETMESSAGE, @MsgFilterFunc, 0, GetCurrentThreadId);
                        Цитата dumbo @
                        надо так:

                        ыть не успел.
                        но это будет хук только для одного потока AFAIK, и на другие процессы никак не повлияет
                          Спасибо, поправил, но теперь приложение висит после установки ловушки.
                            Цитата zsergey @
                            но теперь приложение висит после установки ловушки.

                            дык. что сказали, то и делает:
                            Цитата Unit1.pas:45
                            ...
                            begin
                            Kill := True;
                            case TPMsg(lParam)^.message of
                            ...
                              1. вынеси хук в отдельную dll. примеров море
                              2. код функции-фильтра, которая будет "препятствовать" сворачиванию и закрытию окна программы примерно такой:
                              ExpandedWrap disabled
                                function MsgFilterFunc(Code: Integer; wParam, lParam: Longint): Longint; stdcall;
                                var
                                  Kill: boolean;
                                begin
                                    Result := CallNextHookEx( 0, Code, wParam, lParam);
                                    kill := False;
                                    //здесь стоит добавить проверку на принадлежность окна "целевому" процессу
                                    case PMsg(lParam)^.message of
                                      WM_NCLBUTTONDOWN:
                                        Kill := PMsg(lParam)^.wParam = HTMINBUTTON;
                                      WM_SYSCOMMAND: Kill := PMsg(lParam)^.wParam = SC_MINIMIZE;
                                      WM_QUIT: Kill := True;
                                    end;
                                    if Kill then
                                      PMsg(lParam)^.message := WM_NULL;
                                end;
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0718 ]   [ 16 queries used ]   [ Generated: 18.04.24, 09:26 GMT ]