0

[ ^ ] から、次のコードを導き出しました。

// *********************************** 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();
  • SetStyleUpdateStyles
  • フォームは全画面モードに設定されています
  • フォームの背景色が黒に設定されている
  • 画面上を移動するテキストのサイズが計算されます
  • テキストの初期の x 位置と y 位置が計算されます
  • ASystem.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常にゼロです。

よろしくお願いします。

4

0 に答える 0