![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оценить сколько времени простаивает машина [D7, WinXP]
Dymok © (2008-10-15 16:19:00)Задача: Оценить сколько времени простаивает машина у пользователя.
Например Windows по истечении некоторого заданного времени простоя запускает заставку/ спящий режим
Если машина простаивает например больше 10 минут то отследить через сколько завершится временя простоя и по этому событию сделать например запись в базу данных.
Приложениие должно быть в виде службы
Как отследить простой машины?
staticspb (2009-07-31 01:49:00) [1]
function SecondsIdle: DWord;
var
liInfo: TLastInputInfo;
begin
liInfo.cbSize := SizeOf(TLastInputInfo) ;
liInfo.dwTime
GetLastInputInfo(liInfo) ;
Result := (GetTickCount - liInfo.dwTime) DIV 1000;
end;
Всё уже придумано за вас :-D
Игорь Шевченко (2009-07-16 01:07:00) [2]Alex22 (15.07.09 22:11) [32]
Ну хоть автора указали, и то хлеб. Хотя я этому сайту никаких прав на распространение не давал.
Alex22 (2009-07-15 22:11:00) [3]http://www.delphisources.ru/pages/sources/raznoe/2008-year/idle-monitor.html
(2009-07-06 05:38:00) [4]Удалено модератором
Anatoly Podgoretsky (2008-10-28 19:21:00) [5]> Riply (28.10.2008 13:45:29) [29]
А против обычного простоя книгой борются, толстой.
Riply (2008-10-28 13:45:00) [6]> [24] dymok © (28.10.08 11:02)
> а почему начнутся простои? :)
см. [28] Anatoly Podgoretsky :)
> Offtop
У нас, примерно год назад, внедряли что-то подобное.
Оно "вопросы спрашивало, надо было ответы отвечать" :)
Так вот, я почти день истратила на написание автоматической отвечалки :)
(Там перехват нужен был)
Как ты думаешь, этот день можно отнести к "простоям" ?
P.S.
Да еще и поделилась отвечалкой со своими знакомыми :)
Anatoly Podgoretsky (2008-10-28 12:25:00) [7]> dymok (28.10.2008 11:02:24) [24]
> 2) а почему начнутся простои? :)
Дело чести, обмануть железяку.
han_malign (2008-10-28 11:28:00) [8]HKEY_PERFORMANCE_DATA
Сергей М. (2008-10-28 11:26:00) [9]
> dymok © (28.10.08 11:02) [24]
Плясать отсюда:
http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
Сергей М. (2008-10-28 11:21:00) [10]
> В модуле Windows.pas вообще отсутствуют эти LL
Потому что писан он был еще во времена Win9x/Me, где LL-хуков не было.
> Где их искать то?
WH_KEYBOARD_LL = 13
WH_MOUSE_LL = 14
Реализация хука в отдельном dll-модуле НЕ требуется
dymok (2008-10-28 11:02:00) [11]
> clickmaker © (27.10.08 17:43) [21]
а потом появляются
> такие темы: http://www.delphimaster.ru/cgi-bin/forum.pl?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. Где их искать то?
Сергей М. (2008-10-28 09:39:00) [12]
> Нашел пример хука
Это не тот пример.
Ищи пример для WH_ LL_KEYBOARD и WH_ LL_MOUSE
Riply (2008-10-27 18:03:00) [13]> [20] dymok © (27.10.08 17:26)
> Нашел пример хука (должен отлавливать нажатия клавиш + и -), но при запуске Project1.exe выдаёт ошибку:
> Ошибка при инициализации приложения (0xc000007b). Для выхода из приложения нажмите кнопку "ОК"
1. А почему не воспользоваться GetLastInputInfo ? (писала по памяти - возможны ошибки)
2. А не кажется ли Вашему начальству, что после установки вот таких вот программ на
каждый компьютер и начнутся настоящие простои ? :)
clickmaker (2008-10-27 17:43:00) [14]> В некотором смысле да, слегка бредово. Но вот руководство
> ставит такие задачи, а ему виднее..
а потом появляются такие темы:
http://www.delphimaster.ru/cgi-bin/forum.pl?n=3&id=1224709773
dymok (2008-10-27 17:26:00) [15]Нашел пример хука (должен отлавливать нажатия клавиш + и -), но при запуске 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.
В чем ошибка?
Сергей М. (2008-10-15 19:40:00) [16]
> А какой-нибудь пример
В Тырнете их как грязи
dymok (2008-10-15 17:57:00) [17]
> Сергей М. © (15.10.08 17:35) [15]
самое простое - поставить хуки WH_LL_KEYBOARD,
> WH_LL_MOUSE.Пляши от SetWindowsHookEx.
А какой-нибудь пример использования/описание этих "хуков"?
Германн (2008-10-15 17:39:00) [18]<offtop>
Уж новый век давно пошёл, а геркулесовцы всё еще борются за помещение бывш. гостиницы "Каир". А без компьютеров нынче трудно. :)
</offtop>
dymok (2008-10-15 17:37:00) [19]
> Anatoly Podgoretsky © (15.10.08 17:30) [14]
Да, время от времени список запущенных программ получать - вообще было бы круто.
Сергей М. (2008-10-15 17:35:00) [20]Т.е. вовремя тыкнул клаву, двинул мышь - значит, работает в поте лица ?)
Мда ..
Ну самое простое - поставить хуки WH_LL_KEYBOARD, WH_LL_MOUSE.
Пляши от SetWindowsHookEx.