如何改造 Application.MessageBox ,使提示信息可以拷贝 ( 积分: 50 )

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是 Application.MessageBox 的原代码:
function TApplication.MessageBox(const Text, Caption: PChar; Flags: Longint): Integer;
var
ActiveWindow: HWnd;
WindowList: Pointer;
MBMonitor, AppMonitor: HMonitor;
MonInfo: TMonitorInfo;
Rect: TRect;
FocusState: TFocusState;
begin
ActiveWindow := GetActiveWindow;
MBMonitor := MonitorFromWindow(ActiveWindow, MONITOR_DEFAULTTONEAREST);
AppMonitor := MonitorFromWindow(Handle, MONITOR_DEFAULTTONEAREST);
if MBMonitor <> AppMonitor then
begin
MonInfo.cbSize := Sizeof(TMonitorInfo);
GetMonitorInfo(MBMonitor, @MonInfo);
GetWindowRect(Handle, Rect);
SetWindowPos(Handle, 0,
MonInfo.rcMonitor.Left + ((MonInfo.rcMonitor.Right - MonInfo.rcMonitor.Left) div 2),
MonInfo.rcMonitor.Top + ((MonInfo.rcMonitor.Bottom - MonInfo.rcMonitor.Top) div 2),
0, 0, SWP_NOACTIVATE or SWP_NOREDRAW or SWP_NOSIZE or SWP_NOZORDER);
end;
WindowList := DisableTaskWindows(0);
FocusState := SaveFocusState;
if UseRightToLeftReading then Flags := Flags or MB_RTLREADING;
try
Result := Windows.MessageBox(Handle, Text, Caption, Flags);
finally
if MBMonitor <> AppMonitor then
SetWindowPos(Handle, 0,
Rect.Left + ((Rect.Right - Rect.Left) div 2),
Rect.Top + ((Rect.Bottom - Rect.Top) div 2),
0, 0, SWP_NOACTIVATE or SWP_NOREDRAW or SWP_NOSIZE or SWP_NOZORDER);
EnableTaskWindows(WindowList);
SetActiveWindow(ActiveWindow);
RestoreFocusState(FocusState);
end;
end;

我想在它的基础上,让提示信息可以拷贝,这个功能很重要,不知道为何delphi不支持。
如果实现 提示信息拷贝 比较麻烦,那么也可以在提示窗体上加一个按钮,点这个按钮就让提示信息拷贝到粘贴板 ;

不知道有没有朋友搞过这个。
 
晕,在对话框中按“Ctrl+”不就可以复制了
 
MessageBox是从系统API载入的对话框,不只是DELPHI,其它使用API的程序都不能做到。
如果要拷出来,只能重载TApplication下的这个函数,用自己的窗体替换只。
另外,我从对话框复制文本是使用Spy4Win或者SpyWindow之类的工具来抓取控件标题实现的。
 
呵呵~~~~~谁说Application.MessageBox 信息不能拷贝? 你按一下Ctrl+C试试?
 
你传进去的信息顺便也复制一个进粘贴板中不就行啦!
 
Ctrl+C就行了
 
还是建议楼主自己重载做一个。
 
服了楼主,贴了那么长的程序有用的就是一句:Windows.MessageBox;
MessageBox 也是 Windows 预置的窗口,也是人编出来的;
办法很简单:自己写一个提示窗口,别说拷贝字符串,贴个“熊猫烧香”也行。
 
自己写一个提示框是比较简单的方法。
 
后退
顶部