????怎么搞定????我在窗体外单击一下,窗体仍然具有焦点? 还请指教??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 外面Click只改变Windows得Zorder, 并没有改变Focus, 试试在OnDeactive事件中加入PostMessage(Handle, WM_KillFocus,0,0)试下? 看看用SETFOCUS(HWND)将焦点强行移开如何? 我个人觉得这种事情很少发生。因为可能是默认了吧。如果要是设置为默认的。直接按回车健就可以使用BUTTON健。这个问题不会影响你的程序吧。所以就算是出现点问题也不要太再意了。我也是用DELPHI6的。所以大家是同道中人。祝你好运!!!!!!!! 首先,你要的结果是在窗口丢失焦点后,然后再获得焦点。其次,OnDeactive事件时发生在丢失焦点以前。解决的方法有两个:1.限制鼠标不要出你的窗体2.修改VCL procedure TForm1.FormCreate(Sender: TObject);begin Dragacceptfiles(form1.handle,true);end;这是支持文件拖放的程序设置的东东,效果和你的差不多吧,你试试 在“Hook Functions”里有个“MouseProc”,用它来试一下,就像屏蔽键盘一样,可以屏蔽鼠标事件。LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates); 提问提拔要求说清楚:>>是要你的程序永远有焦点是吗?如果是这样,可以做到:设置Application.OnDeActive事件即可!代码如下:procedure ForceForegroundWindow(hwnd: THandle);var hlp: TForm;begin hlp := TForm.Create(nil); try hlp.BorderStyle := bsNone; hlp.SetBounds(0, 0, 1, 1); hlp.FormStyle := fsStayOnTop; hlp.Show; mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetForegroundWindow(hwnd); finally hlp.Free; end;end;然后在Application.OnDeActive中添加代码:ForceForegroundWindow(Handle)Test Ok for WinXP。 我只是想试试能不能实现这个功能而已。我用的也是XP,但好像KingRom的代码并不能实现。 >>我用的也是XP,但好像KingRom的代码并不能实现。看看下面的可不可以?unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, AppEvnts, StdCtrls;type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; AppEvent: TApplicationEvents; procedure AppEventDeactivate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure ForceForegroundWindow(hwnd: THandle);var hlp: TForm;begin hlp := TForm.Create(nil); try hlp.BorderStyle := bsNone; hlp.SetBounds(0, 0, 1, 1); hlp.FormStyle := fsStayOnTop; hlp.Show; mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetForegroundWindow(hwnd); finally hlp.Free; end;end;procedure TForm1.AppEventDeactivate(Sender: TObject);begin ForceForegroundWindow(Screen.Forms[0].Handle);end;procedure TForm1.Button1Click(Sender: TObject);begin ShowMessage('TEST');end;end.object Form1: TForm1 Left = 192 Top = 114 Width = 696 Height = 480 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Memo1: TMemo Left = 15 Top = 10 Width = 501 Height = 286 Lines.Strings = ( 'Memo1') TabOrder = 0 end object Button1: TButton Left = 95 Top = 340 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 1 OnClick = Button1Click end object AppEvent: TApplicationEvents OnDeactivate = AppEventDeactivate Left = 530 Top = 60 endend 我测试是可以的,不过屏幕总是要闪烁一下,你还是用Mouse Hook吧,虽然复杂,但丝好用。 迷茫中的一个IT人... 请问一种模式怎么实现? 窗体的调用 对动态连接库熟悉的高手请进! 大家快来讨论哪? 问一个关于QReport的简单常识性问题,20分一句话 DBGridEH的问题 一个关于日期的小问题 请教高手!!!如何在报表中加入网格?? 关于的应用 如何保存和打开注册文件? 如何通过Dll传递string类型的值。。。
其次,OnDeactive事件时发生在丢失焦点以前。
解决的方法有两个:
1.限制鼠标不要出你的窗体
2.修改VCL
begin
Dragacceptfiles(form1.handle,true);
end;这是支持文件拖放的程序设置的东东,效果和你的差不多吧,你试试
在“Hook Functions”里有个“MouseProc”,用它来试一下,就像屏蔽键盘一样,可以屏蔽鼠标事件。LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
);
>>是要你的程序永远有焦点是吗?如果是这样,可以做到:
设置Application.OnDeActive事件即可!代码如下:
procedure ForceForegroundWindow(hwnd: THandle);
var
hlp: TForm;
begin
hlp := TForm.Create(nil);
try
hlp.BorderStyle := bsNone;
hlp.SetBounds(0, 0, 1, 1);
hlp.FormStyle := fsStayOnTop;
hlp.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hwnd);
finally
hlp.Free;
end;
end;然后在Application.OnDeActive中添加代码:
ForceForegroundWindow(Handle)
Test Ok for WinXP。
看看下面的可不可以?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AppEvnts, StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
AppEvent: TApplicationEvents;
procedure AppEventDeactivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure ForceForegroundWindow(hwnd: THandle);
var
hlp: TForm;
begin
hlp := TForm.Create(nil);
try
hlp.BorderStyle := bsNone;
hlp.SetBounds(0, 0, 1, 1);
hlp.FormStyle := fsStayOnTop;
hlp.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hwnd);
finally
hlp.Free;
end;
end;procedure TForm1.AppEventDeactivate(Sender: TObject);
begin
ForceForegroundWindow(Screen.Forms[0].Handle);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('TEST');
end;end.object Form1: TForm1
Left = 192
Top = 114
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Memo1: TMemo
Left = 15
Top = 10
Width = 501
Height = 286
Lines.Strings = (
'Memo1')
TabOrder = 0
end
object Button1: TButton
Left = 95
Top = 340
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 1
OnClick = Button1Click
end
object AppEvent: TApplicationEvents
OnDeactivate = AppEventDeactivate
Left = 530
Top = 60
end
end