怎么实现showmessage后自动执行回车键,不用按鼠标点击ok就关了对话框(50分)

  • 主题发起人 主题发起人 meijingpengwork
  • 开始时间 开始时间
M

meijingpengwork

Unregistered / Unconfirmed
GUEST, unregistred user!
keybd_event(13,0,0,0); 不行
 
不是很明白,默认应该是获得焦点的,直接回车就行了啊
 
自己手工做一个专门显示提示的窗口吧,还可以像QQ游戏那样在确定按钮处显示个确定倒计时
 
默认是获得了焦点, 我希望系统自动执行回车键,而不是手动按键盘去执行
 
这个问题只能通过创建一个子线程来关闭这个对话框。
以前见过这样程序,思路大概这样:
1、创建子线程,不断监视是不是有ShowMessage对话框。
2、主线程弹出一个ShowMessage对话框,进程停止在这里,但是子线程仍然在跑。
3、子线程通过GetForgroundWindow API得到当前应用程序得前景窗口句柄,也就是ShowMessage这个窗口得句柄。
4、SendMessage(WM_CLOSE, hWnd);hWnd就是ShowMessage对话框得句柄。
5、主线程继续往下执行。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TCloseMessageThread = class(TThread)
public
procedure Execute; override;
constructor Create();
end;
var
Form1: TForm1;

implementation

{$R *.dfm}

{ TCloseMessageThread }

constructor TCloseMessageThread.Create();
begin
FreeOnTerminate:= true;
inherited Create(False);
end;

procedure TCloseMessageThread.Execute;
var
hWndForground: HWND;
sCaption: array [0..254] of char;
begin
while not Terminated do
begin
hWndForground:= GetForegroundWindow();
if hWndForground <> 0 then
begin
GetWindowText(hWndForground, sCaption, Length(sCaption) + 1);
if SameText(sCaption, Application.Title) then //'Project1',主窗口标题不要和工程名相同。
PostMessage(hWndForground, WM_CLOSE, 0, 0);
end;
Sleep(20);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
TCloseMessageThread.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('hello');
end;

end.
 
困难ShowMessage是以ShowModal形式显示MessageForm的
 
嘿嘿,我做了个 MessageBox 实现定时关闭
 
老白,给大家看看怎么做的
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部