紧急求救----有关Delphi4.0编程问题-----高手请进!!!

zyb 2000-04-11 10:00:00
*********************************
E_mail: wxlzyb@263.net,请踊跃解答!
*********************************
现在的104键键盘中都设有2个WINDOWS快捷键和1个鼠标右键快捷键,
有一Delphi4.0程序,含有2个窗体form1(timer1,timer2),form2,代码如下:
定义一全局变量var bl : boolean ;并初始化为false
procedure TForm1.FormShow(Sender : TObject) ;
begin
timer1.Interval := 1 ;
timer1.Enabled := true ;
Form2.Show ;
timer2.Interval := 10000 ;
timer2.Enabled := true ;
end ;
procedure TForm1.Timer1Timer(Sender : TObject) ;
begin
timer1.Enabled := false ;
self.Hide ;
end ;
procedure TForm1.Timer2Timer(Sender : TObject) ;
begin
timer2.Enabled :=false ;
//**********************************************
self.Show ;
SetCursorPos(Form1.Left+50,Form1.Top+50) ;
//*********************************************
//问题就在这里!!!!!!!!!!!!!!
end ;
问题:假设在self.Show前,鼠标点在资源管理器中
的某个文件上,此时按下键盘上的鼠标右键快捷键,
会弹出“打开方式...”类似的弹出菜单;那么如何
实现:self.Show后利用SetCursorPos()函数不但将
鼠标位置移动到指定的form1中的某个位置,同时
鼠标移动后再次按下键盘上的鼠标右键快捷键,此时
弹出的应该是form1的弹出菜单,而不是原来的
“打开方式...”类似的菜单呢?
...全文
386 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongcan 2000-06-09
  • 打赏
  • 举报
回复
我懒得写太多的东西,把你的程序EMAIL给我,我做好后给你好了。
EMAIL:wangzhiyue@yeah.net
zyb 2000-05-17
  • 打赏
  • 举报
回复
对不起,我忘了一些代码,实际上我在form1的oncreate事件中保证所有代码只执行一次,所以不存在Lin所说的情况!类似于如下代码:mybl初始化为false
procedure TForm1.FormShow(Sender : TObject) ;
begin
if not mybl then
begin
timer1.Interval := 1 ;
timer1.Enabled := true ;
Form2.Show ;
timer2.Interval := 10000 ;
timer2.Enabled := true ;
mybl := true ;
end ;
end ;
RIAEasy 2000-04-22
  • 打赏
  • 举报
回复
Lin是对的。
Lin 2000-04-20
  • 打赏
  • 举报
回复
问题在于Form1的OnShow事件上,下面是你的Source:
procedure TForm1.FormShow(Sender : TObject) ;
begin
timer1.Interval := 1 ;
timer1.Enabled := true ;
Form2.Show ;
timer2.Interval := 10000 ;
timer2.Enabled := true ;
end;

procedure TForm1.Timer1Timer(Sender : TObject) ;
begin
timer1.Enabled := false ;
self.Hide ;
end;
Form1刚显示出来,就被Timer1隐藏了。
建议:
1、最好在Form1的OnCreate事件中处理。OnCreate只发生一次,OnShow则每次改变Visible属性都会发生,结果Form1刚显示出来,就被Timer1隐藏了。
2、在SetCursorPos(Form1.Left+50, Form1.Top+50)之前加上SetForegroundWindow(Handle);
我试过了,可以的。
mq 2000-04-17
  • 打赏
  • 举报
回复
水SHOW 水CAPTUREMOUSE
zyb 2000-04-17
  • 打赏
  • 举报
回复
从今天(4月17日)起5天内,谁帮我解决问题,我悬赏300分!!!
------请积极参与!
zyb 2000-04-13
  • 打赏
  • 举报
回复
我试过929的方法但行不通,另外用HOOK的话只能检测到什么时候按下了该键但却不能使鼠标响应弹出form1的弹出菜单!
Firing_Sky 2000-04-13
  • 打赏
  • 举报
回复
我觉得还是用Hook...
zyb 2000-04-13
  • 打赏
  • 举报
回复
我已经将form2浮于屏幕最前端,代码如下:
procedure TForm2.App(Sender : TObject) ;
begin
SetWindowPos(application.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE) ;
application.BringToFront ;
end ;

procedure TForm2.FormCreate(Sender : TObject) ;
begin
Application.Ondeactivate := App ;
end ;
到底如何解决self.show后不但移动鼠标的位置,同时按下键盘上的鼠标右键快捷键,不弹出以前的弹出菜单,而弹出form1的弹出菜单呢?
-----我的这个问题真地很急!!!!请大侠们帮忙!!!----我再悬赏50分!!
jll 2000-04-12
  • 打赏
  • 举报
回复
你是不是想抢在Windows之前处理鼠标右键事件?
好象不好办!用929的方法也许可以,但我估计这样做,你至少需要将自己的程序先运行一次才行……
zyb 2000-04-12
  • 打赏
  • 举报
回复
弟兄们,我的这个问题很急,快些帮我解决吧!
--------感激万分!
Lin 2000-04-11
  • 打赏
  • 举报
回复
在SetCursorPos(Form1.Left+50, Form1.Top+50)之前加上SetForegroundWindow(Handle);
Lin 2000-04-11
  • 打赏
  • 举报
回复
在Self.Show 之后加上SetForegroundWindow(Handle);
929 2000-04-11
  • 打赏
  • 举报
回复
这相当于始终保持你的窗口是活动的,如果窗口是活动的,那么不论是按键还是鼠标都可以被你的程序处理。
我有一个不太好的方法,在APPLICATION的ONDEACTIVATE事件中把主窗口重置为活动窗口。
可以写一个过程:
其中调用API来完成。
SetActiveWindow(Form1.Handle);
SetCursorPos(Form1.Left+50,Form1.Top+50) ;
。。
然后把这个过程指针赋给APPLICATION。ONDEACTIVATE处理中。
但这种处理后,会使WINDOWS无法切换任务,所以还要在适当的地方把这个处理解除。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧