40 1234
发新话题
打印

为什么这个例子总是调试不成功?

为什么这个例子总是调试不成功?

如何检测用户多长时间没有鼠标与键盘操作?
var
   Form1: TForm1;
   RecordHook: HHOOK; // 钩子句柄
   Timer: Integer = 0; // 累计时间, 秒为单位
   State: Boolean = TRUE; // 是否'在线'
   //=========
    Msg: TMsg;
   WndClass: TWndClass;
   HMainWnd: HWND;
implementation

{$R *.dfm}
// 窗体函数
function WindowProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
   MousePos: TPoint; // 鼠标位置
begin
   case (uMsg) of
     WM_TIMER:
       if (State = TRUE) then
       begin
         Inc(Timer);
         if (Timer >= 5) then // 超过5秒认为离开
         begin
           State := FALSE;
           form1.Button1.Caption:='离开了';
         end;
       end;
     end;
   Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;

   // 钩子函数
function JournalRecordProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
   Msg: LongWord;
begin
   if (nCode = HC_ACTION) then // lParam 指向消息结构
   begin
     Msg := PEventMsg(lParam)^.message;
     if ( (Msg >= WM_KEYFIRST) and (Msg <= WM_KEYLAST) ) or // 键盘消息
        ( (Msg >= WM_MOUSEFIRST) and (Msg <= WM_MOUSELAST) ) then // 鼠标消息
     begin
       Timer := 0;
       if (State = FALSE) then // '离开' -> '在线'
       begin
         State := TRUE;
         form1.Button1.Caption:='回来了';
        end;
     end;
   end;
   Result := CallNextHookEx(RecordHook, nCode, wParam, lParam); // 下一个钩子
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
       // 卸载钩子
   UnHookWindowsHookEx(RecordHook);
   // 删除时钟
   KillTimer(HMainWnd, 6);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
      // 安装时钟
    SetTimer(HMainWnd, 6, 1000, nil);

    // 安装钩子
   RecordHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalRecordProc, HInstance, 0);

    // 消息循环
    while GetMessage(Msg, 0, 0, 0) do
   begin
     if (Msg.message = WM_CANCELJOURNAL) then // 此时需要重新挂钩
       RecordHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalRecordProc, HInstance, 0)
     else
       DispatchMessage(Msg);
      end;
end;
end.

TOP

为什么这个例子总是调试不成功,总是卡在下面的代码段,表现为程序主窗口显示不出来:
去掉下面的语句,则主窗口能显示出来。放在FormCreate中也不行。
// 消息循环
    while GetMessage(Msg, 0, 0, 0) do
   begin
     if (Msg.message = WM_CANCELJOURNAL) then // 此时需要重新挂钩
       RecordHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalRecordProc, HInstance, 0)
     else
       DispatchMessage(Msg);
      end;

TOP

晕。。。

建议楼主看 Forms 单元的代码。。。TApplication类。。。
超级简单易用的音视频转换组件 支持RMVB解码 FFmpeg for Delphi / VB http://www.CCAVC.com

TOP

看不懂,满眼尽是begin和end

TOP

引用:
原帖由 hacker47 于 2008-4-5 15:37 发表
看不懂,满眼尽是begin和end
替换成 { }
超级简单易用的音视频转换组件 支持RMVB解码 FFmpeg for Delphi / VB http://www.CCAVC.com

TOP


别调试了。写日志。
单如暴雨哗哗下
刀似长江滚滚来
横批:韩信点兵

TOP

豆,鹅在水区等你昵,快点哦~
不加检点的生活不值一过

TOP

每次的消息不一样的,仔细想想就明白了。
单如暴雨哗哗下
刀似长江滚滚来
横批:韩信点兵

TOP

楼主明显不了解Windows消息机制。。。
超级简单易用的音视频转换组件 支持RMVB解码 FFmpeg for Delphi / VB http://www.CCAVC.com

TOP

在这里用GetMessage似乎不妥吧?如果消息队列中没有消息GetMessage是不会返回的(死了),那你的窗口自然也就不会显示了。消息循环是在Application对象创建之前就开始的,你应该看看TApplication的代码了。
备注:为什么我每次打超过50个字总要有错字呢...

[ 本帖最后由 withy 于 2008-4-5 19:04 编辑 ]

TOP

 40 1234
发新话题