没有窗体怎么使用定时器呢? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061112185601249.html
做那中简单的程序的时候(不是控制台程序),想要使用API函数SetTimer来设置定时器,请问应该怎么写代码呢,关键是那个HWND应该是什么呢,我没有窗体怎么设置
简单的方法,就是用一个隐藏的窗体,好像没有窗体是不能成为一个程序的,除非你做的是服务程序,你如果做过c写windows程序就会对这一点有比较深的认识了。
毕竟时钟也是一个事件,必须用消息队列,有消息队列,一般就必须制定什么窗体接受这个消息队列。
看了你的要求,我想很多人碰到过你的想法,包括本人,但是你有这种想法,如果不是服务程序,只能说明你的程序体系没有构思好,构思好了,就不会有你这种想法,或者说很容易找到解决方法。
到MSDN看SetTimer的帮助
晕, 楼上的等于没说嘛
怎么可能没窗体呢?这是 delphi,至少也要个主窗体才能运行的.
不过可以考虑自写一线程作 timer 的嘛, 简单得很
procedure xxx.Execute;
begin
while not Terminated do
begin
if FTimerEvent := TEVent.WaitFor(FInterval) = wrTimeout then
Synchronize(DoTimer); 你爱挂哪挂哪
end;
end;
Delphi才不是必须要窗体呢,从Project菜单中选择Remove From Project 就可以删掉自动生成的窗体,代码可以在工程文件的benin end.之间添加,这样的话就没有窗体了,明明用不到前台界面的话,再添加一个隐藏的窗体进去,总是感觉有点多余
我要研究下楼上的代码先
也可以使用多媒体定时器:
timeSetEvent
program Project1;
uses
Windows,Dialogs;
procedure TimerProc(hWindow:HWND; uMsg:UINT; idEvent:UINT; dwTime:DWORD);stdcall;
begin
Showmessage('a');
end;
var Msg: TMsg;
begin
SetTimer(HWND(nil),1,3000,@TimerProc);
while GetMessage(Msg, 0, 0, 0) do TranslateMessage(Msg);
KillTimer(HWND(nil),1);
end.
我是这样写的
可是为什么没有显示对话框?
这样哈, 这样倒是没想过, 不过也行, Application.Handle 是任务栏上的那个 hwnd 不知道能不能用作 timer 用
窗口句柄是一定要的, timer 要求进入消息队列
楼上说的好,“消息队列”,就是这个,没有窗口,谁检索这个呢?
仔细看看我1、2 楼的分析,不要想当然
楼主要求 BT 哈, Application.Handle 试过不行的话就可以考虑用线程了吧, 要不然的确是作不了
问题终于解决了,楼上不对,由于没有使用Forms单元,何来Application?
我认为,窗口句柄不见得那么必需,我解决的时候是在大循环中加入DispatchMessage函数,这样才能将WM_TIMER消息送到预先定义的回掉函数?虽然仍有不解,但是代码工作的很好,CPU使用率也没有什么异常
分数什么的怎么处理?不知道啊
// DELPHI写程序可以没有窗体.
// 新建一个Application,然后关闭 Unit1,不要保存。再ALT + P, V,修改为以下代码
program Project1;
uses
// Forms;
Windows;
{$R *.RES}
var
i: integer;
begin
for i := 0 to 100 do
begin
Sleep(1000);
end;
// Application.Initialize;
// Application.Run;
end.
//测试通过
program Project1;
uses
Windows,Dialogs;
procedure TimerProc(hWindow:HWND; uMsg:UINT; idEvent:UINT; dwTime:DWORD);stdcall;
begin
Showmessage('a');
end;
var Msg: TMsg;
begin
SetTimer(HWND(nil),1,3000,@TimerProc);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg); //〈〈〈add
end;
KillTimer(HWND(nil),1);
end.
我的这个行吗?
procdure Tmythread.execute;
var
t1,t2:Dword;
begin
t1:=gettickcount;
t2:=gettickcount;
while ((t2-t1)<10000) do
begin
...
t2:=gettickcount;
sleep(500);
end;
end;
HandleAllcoate
AllocateHWnd 用这个