주의 : 이 방법을 사용할 경우 TimeOut 시간 내에 버튼을 눌러 MessageBox를 닫은 경우
PostQuitMessage가 활성화된 창으로 전송되어 메인 창이 닫히는 버그가 있습니다.
[팁] 게시판의 원래 글에는 답글이 달려있으나 여기는 없어서 한참 고생했습니다. ^^
조금 수정 했습니다, 뜨는 폼의 caption과 버튼등을 알때 사용합니다...
누가 DLL에 메세지를 많이 넣어서 자동으로 뜰만하거 삭제시도 사용해 보았습니다
<!--CodeS-->
procedure MessageBoxTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD);
var
TargethWnd, ButtonWnd : LongWord; //HWND;
Msg: TMSG;
begin
TargethWnd := FindWindow(nil, PChar('폼Caption명'));
if (TargethWnd <> 0) then begin//and(TargethWnd = hWnd)
ButtonWnd := FindWindowEX(TargethWnd, 0, nil, PChar('OK')); //nil 또는 PChar('TButton')
if (ButtonWnd <> 0) then begin
PostMessage(ButtonWnd, WM_LBUTTONDOWN, 0, 0);
PostMessage(ButtonWnd, WM_LBUTTONUP, 0, 0);
end;
거기서 퍼왔습니다~~
......
var
Form1: TForm1;
procedure MessageBoxTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD); stdcall;
implementation
{$R *.dfm}
procedure MessageBoxTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD);
begin
PostQuitMessage(0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
idTimer: UINT;
msg: TMSG;
begin
idTimer := SetTimer(0, 0, 2000, @MessageBoxTimerProc);
MessageBox(0, '123', '정보', MB_OK);
KillTimer(0, idTimer);
PeekMessage(msg, 0, WM_QUIT, WM_QUIT, PM_REMOVE)
end;
......