如何判断计算机已在一定时间内没有操作? 类似于MSN? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 {象MSN那样判断用户是否在电脑旁操作。 --- By 麻子。}program UseHook;//-----按 Icon.txt 生成 icon.Res 编译到exe中---------{$R '..\Icon\icon.Res' '..\Icon\Icon.txt' }uses Windows,ShellAPI;const ClassName = 'LiuMaZi'; //窗体类名 WindowsName = 'LoveLiuMazi';//窗体标题 WM_COMMAND = $0111; //单击菜单项消息 WM_LBUTTONDOWN = $0201; //鼠标左键单击消息 WM_TIMER = $0113; //计时器函数 WM_KEYFIRST = $0100; //第一个键盘消息 WM_KEYLAST = $0108; //最后一个键盘消息 WM_MOUSEFIRST = $0200; //第一个鼠标消息 WM_MOUSELAST = $020A; //最后一个鼠标消息 WM_MyTray = $0800; //自定义消息,用于响应托盘操作var MyMessage : TMsg; //消息结构 WinClass : TWndClass; //窗体类结构 WinHandle : hWnd; //窗体句柄 PopupMenu : hMenu; //菜单句柄 MousePos : TPoint; //鼠标位置 IconData : TNotifyIconData; //托盘结构 Count : integer; //累计经过的时间 state : Boolean=True; //当前状态,True为在线,False为离开 NextHook : LongWord; //-----------窗体消息处理过程,回调函数-------function WndProc(WinH : hWnd; WinMsg,WParam,LParam : Longint): Integer; StdCall;Begin Result := 0; Case WinMsg of //预定时间到 WM_TIMER :begin if state=True then begin Count:=Count+1; {5秒后"离开"} if Count=5 then begin //换托盘图标为离开 IconData.HIcon:=LoadIcon(hInstance,'Icon2'); IconData.UFlags:=NIF_ICON ; Shell_NotifyIcon(NIM_MODIFY,@IconData); //置当前状态为离开 state:=False; end; end; end; //鼠标单击菜单 WM_COMMAND:begin {菜单项ID} case WParam of {关于} 1: MessageBox(0,'刘浏 QQ : 71892967'+#13+ 'http://Liumazi.efile.com.cn/'+#13+ 'MSN: [email protected] ', '象MSN那样判断用户离开',MB_OK); {退出} 2: PostQuitMessage(0);//给线程消息队列送WM_QUIT退出消息 end; end; //操作托盘图标 WM_MyTray :begin {鼠标左键} if (LParam = WM_LBUTTONDOWN) Then begin //在鼠标当前位置处弹出菜单 SetForegroundWindow(WinHandle); GetCursorPos(MousePos); TrackPopupMenu(PopupMenu,tpm_LeftAlign Or tpm_LeftButton, MousePos.X,MousePos.Y,0,WinHandle,nil); end; end;//其他消息调用默认消息处理过程 else Result := DefWindowProc(WinH,WinMsg,WParam,LParam); end;end;//-------钩子回调函数---(有消息时候该函数将被调用)-----------------function HookProc( iCode:Integer; wParam:WPARAM; lParam:LPARAM ):LRESULT;stdcall;begin Result:=CallNextHookEx(NextHook,iCode,wParam,lParam); //键盘消息 if ( (PEventMsg(lparam)^.message>=WM_KEYFIRST)and (PEventMsg(lparam)^.message<=WM_KEYLAST) ) or //鼠标消息 ( (PEventMsg(lparam)^.message>=WM_MOUSEFIRST)and (PEventMsg(lparam)^.message<=WM_MOUSELAST) )then begin Count:=0; if state=false then begin //换托盘图标为离开 IconData.HIcon:=LoadIcon(hInstance,'Icon1'); IconData.UFlags:=NIF_ICON ; Shell_NotifyIcon(NIM_MODIFY,@IconData); //置当前状态为在线 state:=True; end; end; end;//----------------主程序------------------begin //找到则说明已有一个实例运行 if findwindow(Pchar(ClassName),Pchar(WindowsName))<>0 then MessageBox(0,'程序已运行.....^_^ ','',MB_OK) else begin //填充窗体类结构体 With WinClass do Begin Style := 0; {类风格} lpfnWndProc := @WndProc; {窗口过程} cbClsExtra := 0; {额外类信息} cbWndExtra := 0; {额外窗口信息} hIcon := 0; {图标} hCursor := 0; {光标} hbrBackground := 0; {颜色} lpszMenuName := nil; {菜单} lpszClassName := ClassName;{类名称} hInstance:=GetModuleHandle(nil);{实例句柄} end; //注册窗体类 RegisterClass(WinClass); //建立一个窗体(不可见) WinHandle :=CreateWindowEx(0,ClassName,WindowsName, ws_OverlappedWindow,0,0, 0,0,0,0,hInstance,nil); //建立菜单 PopupMenu := CreatePopupMenu; //依次添加菜单项 AppendMenu(PopupMenu,mf_Enabled Or mf_String,1,'&Abort'); AppendMenu(PopupMenu,mf_Enabled Or mf_String,2,'E&xit'); //填充托盘结构体 With IconData do begin cbSize := SizeOf(IconData); Wnd :=WinHandle; //指定所属窗体 uID := 100; uFlags := nif_Icon Or nif_Message Or nif_Tip; uCallBackMessage := WM_MyTray; //指定消息ID hIcon := LoadIcon(hInstance,'Icon1'); //指定托盘图标 szTip :='象MSN那样'+#13+'判断用户是否离开 '+#13+'Coder : 刘麻子 '; end; //添加托盘到系统任务栏 Shell_NotifyIcon(nim_Add,@IconData); //创建定时器 SetTimer(WinHandle,1,1000,NIL); //挂消息钩子 NextHook:=SetWindowsHookEx(WH_JOURNALRECORD, HookProc,HInstance,0);//====消息循环==开始=========== {此函数从消息队列取消息,遇WM_QUIT返回Fasle,从而导致循环结束} {如果队列内没消息,则当前线程挂起,直到有消息进入队列} While GetMessage(MyMessage,0,0,0) do DispatchMessage(MyMessage);//分发消息到相应窗体消息处理过程//====消息循环==结束===========//卸载钩子 UnHookWindowsHookEx(NextHook);//删除定时器 KillTimer(WinHandle,1);//释放菜单 DestroyMenu(PopupMenu);//释放托盘 IconData.cbSize:=0; Shell_NotifyIcon(NIM_DELETE,@IconData);//释放窗体 DestroyWindow(WinHandle); end; end. 就算拦截了键盘,鼠标也不完全啊还有很多设备,比如说打印机,其他的USB接口的外不设备也可以对计算机进行操作关键还是监视系统CPU,内存的运行情况等 ;DELPHI制作录音话筒示意图怎样实现? 如何使模式窗口只对弹出它的窗口起作用? 在delphi中怎么把汉字转换成拼音? 请推荐一本书,有CreateToolHelp32Snapshot等函数的。想了解一下进程的操作。谢谢 fastreport打印问题 帮我看看错在哪里了?! 急问 **********获得文件大小的问题********* 打包access的ODBC驱动应该包含那些文件??? delphi5中编译控件包出错? 大家来鄙视我一下! 谁有Crystal Reports 9 VCL - supports Delphi 7,发一份给我,收到即结贴
--- By 麻子。}
program UseHook;
//-----按 Icon.txt 生成 icon.Res 编译到exe中---------
{$R '..\Icon\icon.Res' '..\Icon\Icon.txt' }uses
Windows,ShellAPI;const
ClassName = 'LiuMaZi'; //窗体类名
WindowsName = 'LoveLiuMazi';//窗体标题
WM_COMMAND = $0111; //单击菜单项消息
WM_LBUTTONDOWN = $0201; //鼠标左键单击消息
WM_TIMER = $0113; //计时器函数
WM_KEYFIRST = $0100; //第一个键盘消息
WM_KEYLAST = $0108; //最后一个键盘消息
WM_MOUSEFIRST = $0200; //第一个鼠标消息
WM_MOUSELAST = $020A; //最后一个鼠标消息
WM_MyTray = $0800; //自定义消息,用于响应托盘操作var
MyMessage : TMsg; //消息结构
WinClass : TWndClass; //窗体类结构
WinHandle : hWnd; //窗体句柄
PopupMenu : hMenu; //菜单句柄
MousePos : TPoint; //鼠标位置
IconData : TNotifyIconData; //托盘结构
Count : integer; //累计经过的时间
state : Boolean=True; //当前状态,True为在线,False为离开
NextHook : LongWord; //-----------窗体消息处理过程,回调函数-------
function WndProc(WinH : hWnd; WinMsg,WParam,LParam : Longint): Integer; StdCall;
Begin
Result := 0;
Case WinMsg of
//预定时间到
WM_TIMER :begin
if state=True then
begin
Count:=Count+1;
{5秒后"离开"}
if Count=5 then
begin
//换托盘图标为离开
IconData.HIcon:=LoadIcon(hInstance,'Icon2');
IconData.UFlags:=NIF_ICON ;
Shell_NotifyIcon(NIM_MODIFY,@IconData);
//置当前状态为离开
state:=False;
end;
end;
end;
//鼠标单击菜单
WM_COMMAND:begin {菜单项ID}
case WParam of
{关于}
1: MessageBox(0,'刘浏 QQ : 71892967'+#13+
'http://Liumazi.efile.com.cn/'+#13+
'MSN: [email protected] ',
'象MSN那样判断用户离开',MB_OK);
{退出}
2: PostQuitMessage(0);//给线程消息队列送WM_QUIT退出消息
end;
end;
//操作托盘图标
WM_MyTray :begin {鼠标左键}
if (LParam = WM_LBUTTONDOWN) Then
begin
//在鼠标当前位置处弹出菜单
SetForegroundWindow(WinHandle);
GetCursorPos(MousePos);
TrackPopupMenu(PopupMenu,tpm_LeftAlign Or tpm_LeftButton,
MousePos.X,MousePos.Y,0,WinHandle,nil);
end;
end;
//其他消息调用默认消息处理过程
else Result := DefWindowProc(WinH,WinMsg,WParam,LParam);
end;
end;
//-------钩子回调函数---(有消息时候该函数将被调用)-----------------
function HookProc( iCode:Integer; wParam:WPARAM; lParam:LPARAM ):LRESULT;stdcall;
begin
Result:=CallNextHookEx(NextHook,iCode,wParam,lParam);
//键盘消息
if ( (PEventMsg(lparam)^.message>=WM_KEYFIRST)and
(PEventMsg(lparam)^.message<=WM_KEYLAST) ) or
//鼠标消息
( (PEventMsg(lparam)^.message>=WM_MOUSEFIRST)and
(PEventMsg(lparam)^.message<=WM_MOUSELAST) )then
begin
Count:=0;
if state=false then
begin
//换托盘图标为离开
IconData.HIcon:=LoadIcon(hInstance,'Icon1');
IconData.UFlags:=NIF_ICON ;
Shell_NotifyIcon(NIM_MODIFY,@IconData);
//置当前状态为在线
state:=True;
end;
end;
end;//----------------主程序------------------
begin //找到则说明已有一个实例运行
if findwindow(Pchar(ClassName),Pchar(WindowsName))<>0 then
MessageBox(0,'程序已运行.....^_^ ','',MB_OK)
else
begin
//填充窗体类结构体
With WinClass do
Begin
Style := 0; {类风格}
lpfnWndProc := @WndProc; {窗口过程}
cbClsExtra := 0; {额外类信息}
cbWndExtra := 0; {额外窗口信息}
hIcon := 0; {图标}
hCursor := 0; {光标}
hbrBackground := 0; {颜色}
lpszMenuName := nil; {菜单}
lpszClassName := ClassName;{类名称}
hInstance:=GetModuleHandle(nil);{实例句柄}
end;
//注册窗体类
RegisterClass(WinClass);
//建立一个窗体(不可见)
WinHandle :=CreateWindowEx(0,ClassName,WindowsName,
ws_OverlappedWindow,0,0,
0,0,0,0,hInstance,nil);
//建立菜单
PopupMenu := CreatePopupMenu;
//依次添加菜单项
AppendMenu(PopupMenu,mf_Enabled Or mf_String,1,'&Abort');
AppendMenu(PopupMenu,mf_Enabled Or mf_String,2,'E&xit');
//填充托盘结构体
With IconData do
begin
cbSize := SizeOf(IconData);
Wnd :=WinHandle; //指定所属窗体
uID := 100;
uFlags := nif_Icon Or nif_Message Or nif_Tip;
uCallBackMessage := WM_MyTray; //指定消息ID
hIcon := LoadIcon(hInstance,'Icon1'); //指定托盘图标
szTip :='象MSN那样'+#13+'判断用户是否离开 '+#13+'Coder : 刘麻子 ';
end;
//添加托盘到系统任务栏
Shell_NotifyIcon(nim_Add,@IconData);
//创建定时器
SetTimer(WinHandle,1,1000,NIL);
//挂消息钩子
NextHook:=SetWindowsHookEx(WH_JOURNALRECORD, HookProc,HInstance,0);
//====消息循环==开始===========
{此函数从消息队列取消息,遇WM_QUIT返回Fasle,从而导致循环结束}
{如果队列内没消息,则当前线程挂起,直到有消息进入队列}
While GetMessage(MyMessage,0,0,0) do
DispatchMessage(MyMessage);//分发消息到相应窗体消息处理过程
//====消息循环==结束===========//卸载钩子
UnHookWindowsHookEx(NextHook);
//删除定时器
KillTimer(WinHandle,1);
//释放菜单
DestroyMenu(PopupMenu);
//释放托盘
IconData.cbSize:=0;
Shell_NotifyIcon(NIM_DELETE,@IconData);
//释放窗体
DestroyWindow(WinHandle);
end;
end.
也可以对计算机进行操作关键还是监视系统CPU,内存的运行情况等