从 [ ^ ],我得出以下代码:
// *********************************** show_bubble_scr_preview
[ DllImport ( "user32.dll" ) ]
static extern IntPtr SetParent ( IntPtr clild_window_handle,
IntPtr parent_window_handle );
[ DllImport ( "user32.dll" ) ]
static extern bool MoveWindow ( IntPtr window_handle,
int x,
int y,
int width,
int height,
bool repaint );
public static void show_bubble_scr_preview ( Control control )
{
string path = @"C:\Windows\System32\Bubbles.scr";
if ( File.Exists ( path ) )
{
try
{
IntPtr window_handle;
Process process = new Process ( );
process.StartInfo.FileName = path;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.Arguments = "/P " + control.Handle;
process.Start();
window_handle = process.MainWindowHandle;
process.WaitForInputIdle ( );
if ( window_handle != IntPtr.Zero )
{
Rectangle client_rectangle = control.
ClientRectangle;
SetParent ( window_handle, control.Handle );
MoveWindow ( window_handle,
client_rectangle.Left,
client_rectangle.Top,
client_rectangle.Width,
client_rectangle.Height,
true);
}
}
catch ( Exception ex )
{
}
}
}
父表单包含在表单中移动的用户指定文本。在父窗体的初始化期间,会发生以下操作:
InitializeComponent();
SetStyle
和UpdateStyles
- 表单设置为全屏模式
- 表单背景颜色设置为黑色
- 计算将在屏幕上移动的文本大小
- 计算文本的初始 x 和 y 位置
- A
System.Timers.Timer
创建并启动 - 最后
show_bubble_scr_preview(this)
被调用
计时器事件处理程序是:
// ****************************************************** tick
void tick ( object source, ElapsedEventArgs e )
{
try
{
if ( this.InvokeRequired )
{
this.Invoke (
new EventHandler (
delegate
{
this.Refresh ( );
}
)
);
}
else
{
this.Refresh ( );
}
}
catch ( Exception ex )
{
}
}
OnPaint
文本在其中被重新定位和重新绘制。
我试图实现的是让 Bubbles.scr 图像在文本移动时漂浮在表单周围。我得到的是,非常简短地,出现 Bubbles.scr 图像,然后出现全屏黑色形式。文本按预期移动。但是没有气泡。process.MainWindowHandle
始终为零。
我很感激你的想法。