Конференция "WinAPI" » Оценить сколько времени простаивает машина [D7, WinXP]
 
  • Dymok © (15.10.08 16:19) [0]
    Задача: Оценить сколько времени простаивает машина у пользователя.
    Например Windows по истечении некоторого заданного времени простоя запускает заставку/ спящий режим
    Если машина простаивает например больше 10 минут то отследить через сколько завершится временя простоя и по этому событию сделать например запись в базу данных.
    Приложениие должно быть в виде службы
    Как отследить простой машины?
  • Сергей М. © (15.10.08 16:24) [1]
    Стесняюсь спросить, а нафига все это ?
    Т.е. какую практическую ценность принесет реализация всего этого ?
  • Dymok © (15.10.08 16:40) [2]
    А чего стесняться-то? здесь все свои, дело то житейское..
    Покупаем компы в организации, устанавливаем. А потом оказывается что половину времени он стоит без движения. Юсер пришел на работу, включил и потом занялся еще чем-то своим. Т.е. комп ему по сути и не был нужен.
    Вывод: отобрать и отдать нуждающимся.
  • KSergey © (15.10.08 16:44) [3]
    Можно и просто отобрать.
    Неужели нужно обоснование?!!

    потом от другого будет вопрос: как имитировать использование компа.
    Бред
  • Сергей М. © (15.10.08 16:46) [4]
    А нельзя ли комп отдать сразу тому кто действительно в нем нуждается ?)

    И зачем нужно что-то писать, если достаточно установить скринсейвер с запароленым выходом из спячки ? Юзер сам прибежит, мол, чевой-то такое у меня, что еще за пароль от меня требуют).. И шпионить за ним не надо - вот он, сачок, сам явился на поклон)
  • dymok © (15.10.08 16:51) [5]
    В некотором смысле да, слегка бредово. Но вот руководство ставит такие задачи, а ему виднее..
    Сразу отдать комп нельзя - нужен не нужен - просят  многие, почти все.
    а вот используют... как зря...
  • dymok © (15.10.08 16:53) [6]
    Если просто скрин поставить то пользователи и нагрянут все толпой через 10 минут. А нужно оценить суммарное время простоя.
  • Сергей М. © (15.10.08 16:58) [7]
    Т.е. твое руководство свято верит в то, что исправное выполнение сотрудником трудовых обязанностей, связанных с использованием компа, сводится к регулярному, не реже установленного интервала времени, мышеелозанью и клаводавлению ?)
  • Сергей М. © (15.10.08 17:02) [8]

    > Если просто скрин поставить то пользователи и нагрянут все
    > толпой через 10 минут


    Так вот же они, бездельники !)
    Сразу появляется веское основание вытолкать всех их в шею)
    Тогда мож и компы зря были куплены ?


    > нужно оценить суммарное время простоя


    Тоже не проблема)
    Выдаешь юзеру пароль к скринсейверу, а скринсейвер настраиваешь на запись о своем состоянии в AppEvents-лог.
  • dymok © (15.10.08 17:05) [9]
    ну вот есть у них такая идея, что ж теперь делать...
    хотелось бы все таки не обсуждать руководство, бог с ним, а узнать можно ли это оценить это время
    Наверняка ведь можно...
  • Сергей М. © (15.10.08 17:10) [10]
    Ну хорошо. Начальству в зад не заглядывают)

    А подробную и внятную формулировку термина "простой машины" руководство тебе представило ?

    От нее и плясать ведь надо ..
  • dymok © (15.10.08 17:23) [11]
    Как тебе такая формулировка
    1-ый шаг: пользователь включил машину - служба запустилась, сделала например запись в некоторую базу данных (или лог-файл).
    2 -ой шаг:  Допустим пользователь не прикасался к клавиатуре/мыши 20 минут (некоторое задаваемое критическое время), с этого момента пошел отсчет простоя. Отсчет до тех пор, пока он вновь не коснулся клавиатуры. По последнему событию вновь запись, дескать с 8-20 до, предположим,  10 часов машина не использовалась.
  • dymok © (15.10.08 17:23) [12]
    Как тебе такая формулировка
    1-ый шаг: пользователь включил машину - служба запустилась, сделала например запись в некоторую базу данных (или лог-файл).
    2 -ой шаг:  Допустим пользователь не прикасался к клавиатуре/мыши 20 минут (некоторое задаваемое критическое время), с этого момента пошел отсчет простоя. Отсчет до тех пор, пока он вновь не коснулся клавиатуры. По последнему событию вновь запись, дескать с 8-20 до, предположим,  10 часов машина не использовалась.
  • Anatoly Podgoretsky © (15.10.08 17:29) [13]
    > Сергей М.  (15.10.2008 16:46:04)  [4]

    А кризис безработицы, если не защищать свое рабочее место, то возможно фирма в нем не будет нуждаться.
  • Anatoly Podgoretsky © (15.10.08 17:30) [14]
    > dymok  (15.10.2008 16:51:05)  [5]

    Машина может не простаивать, а вот пользы может быть еще меньше.
    Следующий вопрос, тарифицирование по запущеным программам.
  • Сергей М. © (15.10.08 17:35) [15]
    Т.е. вовремя тыкнул клаву, двинул мышь - значит, работает в поте лица ?)

    Мда ..

    Ну самое простое - поставить хуки WH_LL_KEYBOARD, WH_LL_MOUSE.
    Пляши от SetWindowsHookEx.
  • dymok © (15.10.08 17:37) [16]

    > Anatoly Podgoretsky ©   (15.10.08 17:30) [14]

    Да, время от времени список запущенных программ получать - вообще было бы круто.
  • Германн © (15.10.08 17:39) [17]
    <offtop>
    Уж новый век давно пошёл, а геркулесовцы всё еще борются за помещение бывш. гостиницы "Каир". А без компьютеров нынче трудно. :)
    </offtop>
  • dymok © (15.10.08 17:57) [18]

    > Сергей М. ©   (15.10.08 17:35) [15]
    самое простое - поставить хуки WH_LL_KEYBOARD,
    >  WH_LL_MOUSE.Пляши от SetWindowsHookEx.

    А какой-нибудь пример использования/описание этих "хуков"?
  • Сергей М. © (15.10.08 19:40) [19]

    > А какой-нибудь пример


    В Тырнете их как грязи
  • 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]
Есть новые Нет новых   [134432   +18][b:0][p:0.001]