[ ^ ] から、次のコードを導き出しました。
// *********************************** 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
常にゼロです。
よろしくお願いします。