三个问题,一个位运算,两个控制台(120分)

  • 主题发起人 主题发起人 lance2000
  • 开始时间 开始时间
L

lance2000

Unregistered / Unconfirmed
GUEST, unregistred user!
1。c++中的 a¦b 在delphi中如何写?(20)
2。如何让控制台程序不出现在任务栏里?(50)
3。控制台程序中如何使用定时器?(50)
 
1. a and b
2. ShowWindow(The_Handle, SW_HIDE);
3. int 8
 
wu......
eyes手太快乐。
 
1。c++中的 a¦b 在delphi中如何写?(20)
是 a or b 吧
2。如何让控制台程序不出现在任务栏里?(50)
为什么一定要用控制台呢,拿个form放个memo不也是一样的?
3。控制台程序中如何使用定时器?(50)
呵呵,如果用2的方法,那再放个定时器就行了。
 
a or b 在c中应该是a|b吧? 还是我记错了?
 
To :Another_eYes
a or b 在c中应该是a|b吧? 还是我记错了?
~~~~不知道是不是我的IE有问题,我看到原贴中的的确是这样的
难道我的IE把“&”显示成“|”了
 
1. 全格式应该是 a?b:c, 相当于 if a then b else c;

3. uses extctrls;
var t:ttimer;

begin
t:=ttimer.create(application);
t.interval:=1000;
t.ontimer:=ontimerhandle;
t.enabled:=true;
end;
 
to:Another_eYes
the handle 如何写? 反正application.handle 是不可以的.


to JJams:
事实上,我想写一个后台监视程序.比如,在上课时间学生启动了游戏,将被自动
关闭.如果基于VCL,那么很难作到350k以下.对于一个一直运行的程序我想越小越好.
如果基于VCL 则很简单. 另, 你和Jams什么关系?




 
最好对一些自己能处理的问题多差一些资料对编程会有帮助的他们说的都可以是意识的
 
To: lance2000
哈哈,原来想搞怪,没关系,这方面我有经验。这样,先新建一个Application,
然后把Form1(Unit1)去掉,接着new一个DataModule,存盘、编译。看看多大。我用
Delphi4,只有276K,还行吧。再在DataModule上加个Timer,存盘编译,才277K。接下
来是让程序跑起来,由于没有主Form,Application.Run直接就退出了。没关系,在
Application.Run; 的前面加上
While NOT Application.Terminated do
begin
Application.HandleMessage;
end;
然后再Run程序,呵呵,怎样?神不知鬼不觉吧!
在程序中如果想退出,调用Application.Terminiate;就行。我有很多服务程序都是这么
写的。注意不要把Application.Run给去掉,那样子程序的退出代码就不会执行了。

整人的方法有千万种,再给你介绍一种以前我整人用的方法吧。
文件关联在Windows中使用的相当普遍,记得在Window3.x中就有。当一在Shell中
(现在当然是用Explorer了)运行某个文件时,例如,双击一个TXT文件,这时候Shell
从注册表中找到与其关联的处理程序,然后执行。处理程序在注册表里往往是这样的:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT/txtfile]
@="Text Document"
[HKEY_CLASSES_ROOT/txtfile/shell]
[HKEY_CLASSES_ROOT/txtfile/shell/open]
[HKEY_CLASSES_ROOT/txtfile/shell/open/command]
@=%SystemRoot%//system32//NOTEPAD.EXE %1

也就是说,在Shell中执行 1.TXT 文件相当于执行
%SystemRoot%/system32/NOTEPAD.EXE 1.TXT
所以只要写一个程序替换notepad.exe并放到注册表里,那么什么txt你都何以预览
一遍了right?
回到你的问题上来,你只是想在别人运行程序时知道而已嘛,如果.exe文件的
执行也有这样一个类似的过程,那么相同的方法就可以用上了。看看注册表:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT/exefile]
@="Application"
[HKEY_CLASSES_ROOT/exefile/DefaultIcon]
@="%1"
[HKEY_CLASSES_ROOT/exefile/shell]
[HKEY_CLASSES_ROOT/exefile/shell/open]
[HKEY_CLASSES_ROOT/exefile/shell/open/command]
@="/"%1/" %*"

呵呵,现在怎么样?现在写一个程序,放到注册表中,就可以方便的知道什么程序将要
被运行了。接着你可以做任何你想做的。(弹个对话框说系统资源严重不足怎样?更绝
的是以前宿舍的兄弟竟然出个主意,限制程序每天运行时间,wow有没有搞错呀,游戏
玩了一会儿竟弹个对话框说今天已经玩了很久了??!!够整人吧!!)
 
to: JJams
你的思路很好,我的思路是枚举所有窗口然后判断。 (70分先归你。)

第二个问题,昨晚我已解决。思路是这样的:
由于没有直接取得控制台窗口句柄的API,所以只要先设一个唯一的Title,然后Find
这个窗口,就可得到它的句柄了,然后再HIDE.

我觉得,Timer不能用与非事件驱动的程序中。我想Timer是需要一个消息循环的。
请继续关注第3题。
 
接着来
(1)你真的没有必要用控制台程序,控制台程序只不过是执行时AllocConsole而已。
(2)要用Timer没什么难得,在Application中已经有一个隐藏的窗口了,所以只要
在Application中执行消息循环,把消息给Dispatch到Timer的窗口中就行。
(3)还是给你贴代码吧,我觉得我说的不清楚。
////////////////////////////////////////////////////////////////////////////
工程文件
////////////////////////////////////////////////////////////////////////////
program Project1;

uses
Forms,
extctrls,
Unit1 in 'Unit1.pas';

{$R *.RES}
{$apptype console}
var
timer : TTimer;

begin
Application.Initialize;
//create timer
timer := TTimer.Create(Application);
timer.OnTimer := TSimpleObject.Create.DoTimeup;
timer.Interval := 10000;
timer.Enabled := true;

//message loop
while NOT Application.Terminated do
begin
Application.HandleMessage;
end;

timer.Free;
Application.Run;
end.

////////////////////////////////////////////////////////////////////////////
Unit1.pas
////////////////////////////////////////////////////////////////////////////

unit Unit1;

interface

uses Forms;

type
TSimpleObject = class
public
procedure DoTimeup(Sender : TObject);
end;

implementation

procedure TSimpleObject.DoTimeup(Sender:TObject);
begin
Application.Terminate;
end;

end.

好了,你把“{$apptype console}”拿掉,一切就符合你的要求了!
 
接受答案了.
 
后退
顶部