Конференция "WinAPI" » Оценить сколько времени простаивает машина [D7, WinXP]
 
  • dymok © (27.10.08 17:26) [20]
    Нашел пример хука (должен отлавливать нажатия клавиш + и -), но при запуске Project1.exe выдаёт ошибку:
    Ошибка при инициализации приложения (0xc000007b). Для выхода из приложения нажмите кнопку "ОК"

    Текст модулей следующий:

    library lib;

    uses
     WinTypes, WinProcs, Messages;

    const
    {пользовательские сообщения}
    wm_NextShow_Event = wm_User + 133;
    wm_PrevShow_Event = wm_User + 134;
    {handle для ловушки}
    //HookHandle: hHook = 0;

    var
    SaveExitProc : Pointer;
    HookHandle: hHook = 0;
    {собственно ловушка}
    function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;
    export;
    var
    H: HWND;
    begin
    {если Code>=0, то ловушка может обpаботать событие}
    if Code >= 0 then
    begin
      {это те клавиши?}
      if ((wParam = VK_ADD)or(wParam = VK_SUBTRACT)) and (lParam and $40000000 =
    0)
      then begin
        {ищем окно по имени класса и по заголовку}
        H := FindWindow('TForm1', 'XXX');
        {посылаем сообщение}
        if wParam = VK_ADD then
          SendMessage(H, wm_NextShow_Event, 0, 0)
        else
          SendMessage(H, wm_PrevShow_Event, 0, 0);
      end;
     {если 0, то система должна дальше обpаботать это событие}
     {если 1 - нет}
     Result:=0;
    end
    else
      {если Code<0, то нужно вызвать следующую ловушку}
      Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
    end;

    {пpи выгpузке DLL надо снять ловушку}
    procedure LocalExitProc; far;
    begin
    if HookHandle<>0 then
    begin
      UnhookWindowsHookEx(HookHandle);
      ExitProc := SaveExitProc;
    end;
    end;

    {инициализация DLL пpи загpузке ее в память}
    begin
    {устанавливаем ловушку}
    HookHandle := SetWindowsHookEx(wh_Keyboard, Key_Hook,
                              hInstance, 0);
    if HookHandle = 0 then
      MessageBox(0, 'Unable to set hook!', 'Error', mb_Ok)
    else begin
     SaveExitProc := ExitProc;
     ExitProc := @LocalExitProc;
    end;
    end.


    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;
     
    const
    wm_NextShow_Event = wm_User + 133;
    wm_PrevShow_Event = wm_User + 134;

    type
     TForm1 = class(TForm)
       Label1: TLabel;
       Button1: TButton;
       procedure FormCreate(Sender: TObject);
     private
       { Private declarations }
       procedure WM_NextMSG (Var M : TMessage); message wm_NextShow_Event;
       procedure WM_PrevMSG (Var M : TMessage); message wm_PrevShow_Event;
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;
     P : Pointer;
    implementation

    {$R *.dfm}
    function Key_Hook : Longint; far; external 'lib.dll';

    procedure TForm1.FormCreate(Sender: TObject);
    begin

     P:=@Key_Hook;
    end;

    procedure TForm1.WM_NextMSG(var M: TMessage);
    begin
      Label1.Caption:='Next message';
    end;

    procedure TForm1.WM_PrevMSG(var M: TMessage);
    begin
     Label1.Caption:='Previous message';
    end;

    end.


    В чем ошибка?
  • clickmaker © (27.10.08 17:43) [21]
    > В некотором смысле да, слегка бредово. Но вот руководство
    > ставит такие задачи, а ему виднее..

    а потом появляются такие темы:
    http://pda.delphimaster.net/?n=3&id=1224709773
  • Riply © (27.10.08 18:03) [22]
    > [20] dymok ©   (27.10.08 17:26)
    > Нашел пример хука (должен отлавливать нажатия клавиш + и -), но при запуске Project1.exe выдаёт ошибку:
    > Ошибка при инициализации приложения (0xc000007b). Для выхода из приложения нажмите кнопку "ОК"

    1. А почему не воспользоваться GetLastInputInfo ? (писала по памяти - возможны ошибки)
    2. А не кажется ли Вашему начальству, что после установки вот таких вот программ на
      каждый компьютер и начнутся настоящие простои ?  :)
  • Сергей М. © (28.10.08 09:39) [23]

    > Нашел пример хука


    Это не тот пример.
    Ищи пример для WH_LL_KEYBOARD и WH_LL_MOUSE
  • dymok © (28.10.08 11:02) [24]

    > clickmaker ©   (27.10.08 17:43) [21]
    а потом появляются
    > такие темы:http://pda.delphimaster.net/?n=3&id=1224709773


    Не вижу никаких аналогий. Но на всякий случай, я работаю на отечественном машиностроительном предприятии. Решаемая сейчас задача - каприз руководства. До этого все написанные проекты немного другие и связаны с Oracle+Delphi.

    > Riply ©   (27.10.08 18:03) [22]

    >  А почему не воспользоваться GetLastInputInfo? 2. А не кажется ли Вашему начальству, что после установки вот таких вот программ на   каждый компьютер и начнутся настоящие простои ?  :)


    1)А действительно, почему бы не использовать GetLastInputInfo? Как это мне никто раньше не подсказал эту апишку. Особенно если загнать ее в службу, а? Сейчас попробую. А то уже голову сломал с этими хуками :)
    2) а почему начнутся простои? :)

    > Сергей М. ©   (28.10.08 09:39) [23]
    Это не тот пример.Ищи пример для WH_LL_KEYBOARD  и WH_LL_MOUSE


    В модуле Windows.pas вообще отсутствуют эти LL, есть только обычные WH_KEYBOARD и WH_MOUSE. Где их искать то?
  • Сергей М. © (28.10.08 11:21) [25]

    > В модуле Windows.pas вообще отсутствуют эти LL


    Потому что писан он был еще во времена Win9x/Me, где LL-хуков не было.


    > Где их искать то?


    WH_KEYBOARD_LL = 13
    WH_MOUSE_LL = 14

    Реализация хука в отдельном dll-модуле НЕ требуется
  • Сергей М. © (28.10.08 11:26) [26]

    > dymok ©   (28.10.08 11:02) [24]


    Плясать отсюда:
    http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
  • han_malign © (28.10.08 11:28) [27]
    HKEY_PERFORMANCE_DATA
  • Anatoly Podgoretsky © (28.10.08 12:25) [28]
    > dymok  (28.10.2008 11:02:24)  [24]

    > 2) а почему начнутся простои? :)

    Дело чести, обмануть железяку.
  • Riply © (28.10.08 13:45) [29]
    > [24] dymok ©   (28.10.08 11:02)
    > а почему начнутся простои? :)

    см. [28] Anatoly Podgoretsky :)

    > Offtop
    У нас, примерно год назад, внедряли что-то подобное.
    Оно "вопросы спрашивало, надо было ответы отвечать" :)
    Так вот, я почти день истратила на написание автоматической отвечалки :)
    (Там перехват нужен был)
    Как ты думаешь, этот день можно отнести к "простоям" ?
    P.S.
    Да еще и поделилась отвечалкой со своими знакомыми :)
  • Anatoly Podgoretsky © (28.10.08 19:21) [30]
    > Riply  (28.10.2008 13:45:29)  [29]

    А против обычного простоя книгой борются, толстой.
  • имя (06.07.09 05:38) [31]
    Удалено модератором
  • Alex22 (15.07.09 22:11) [32]
  • Игорь Шевченко © (16.07.09 01:07) [33]
    Alex22   (15.07.09 22:11) [32]

    Ну хоть автора указали, и то хлеб. Хотя я этому сайту никаких прав на распространение не давал.
  • staticspb (31.07.09 01:49) [34]
    function SecondsIdle: DWord;
    var
     liInfo: TLastInputInfo;
    begin
     liInfo.cbSize := SizeOf(TLastInputInfo) ;
     liInfo.dwTime
     GetLastInputInfo(liInfo) ;
     Result := (GetTickCount - liInfo.dwTime) DIV 1000;
    end;



    Всё уже придумано за вас :-D
 
Конференция "WinAPI" » Оценить сколько времени простаивает машина [D7, WinXP]
Есть новые Нет новых   [134434   +27][b:0][p:0.001]