2

pptx ファイルを表示するために、メイン フォームに PowerPoint Viewer を埋め込みました。PC に 2 つのモニターがあり、2 番目のモニターでアプリを実行しようとしています。モニター 1 でプログラムを実行すると、すべてが期待どおりに機能します。しかし、モニター 2 で実行すると (つまり、アプリを実行してから 2 番目のモニターに移動するのではなく、2 番目のモニターでアプリを実行するようにコードを変更します)、PowerPoint Viewer は 1 番目のモニターで開き、次に移動しますプログラムが実行されている 2 番目のモニター。親が適切に設定されていないPowerPointオブジェクトに関係していると思いますが、よくわかりません。これが私のコードです:

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindow(IntPtr ZeroOnly, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool SetWindowText(IntPtr hwnd, String lpString);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, UIntPtr lParam);

public const uint WM_SETFOCUS = 0x0007;
Microsoft.Office.Interop.PowerPoint.Application application;
Microsoft.Office.Interop.PowerPoint.Presentation presentation;

public MainForm()
{
    InitializeComponent();            
    DisplayOnMonitor();
}

private void MainForm_Load(object sender, EventArgs e)
{
    LoadSlideShow();
}

private void LoadSlideShow()
{
    IntPtr screenClasshWnd = (IntPtr)0;
    IntPtr x = (IntPtr)0;

    application = new Microsoft.Office.Interop.PowerPoint.Application();
    presentation = application.Presentations.Open2007(
                    Settings.Default.PowerPointPath,
                    Microsoft.Office.Core.MsoTriState.msoTrue,
                    Microsoft.Office.Core.MsoTriState.msoFalse,
                    Microsoft.Office.Core.MsoTriState.msoFalse,
                    Microsoft.Office.Core.MsoTriState.msoFalse);

    Microsoft.Office.Interop.PowerPoint.SlideShowSettings sst1 = presentation.SlideShowSettings;
    sst1.LoopUntilStopped = Microsoft.Office.Core.MsoTriState.msoTrue;
    Microsoft.Office.Interop.PowerPoint.SlideShowWindow sw = sst1.Run();

    IntPtr pptptr = (IntPtr)sw.HWND;
    SetParent(pptptr, splitContainerControl.Panel1.Handle);

    splitContainerLeft.Panel1.LostFocus += new EventHandler(OnLostFocus);
    splitContainerControl.PreviewKeyDown +=new PreviewKeyDownEventHandler(OnPreviewKeyDown);
    splitContainerLeft.Panel1.AutoSize = true;
    splitContainerControl.Panel1.Focus();
}

private void DisplayOnMonitor()
{
    Screen[] sc;
    sc = Screen.AllScreens;

    this.FormBorderStyle = FormBorderStyle.None;
    this.Left = sc[1].Bounds.Width;
    this.Top = sc[1].Bounds.Height;
    this.StartPosition = FormStartPosition.Manual;
    this.Location = sc[1].Bounds.Location;
    Point p = new Point(sc[1].Bounds.Location.X, sc[1].Bounds.Location.Y);
    this.Location = p;
    this.WindowState = FormWindowState.Maximized;
}

sst1.Run() メソッドが呼び出されたときに PowerPoint Viewer が表示されることはわかっていますが、その前 (および後) にアプリを非表示にしようとしましたが、例外がスローされます。sst1 にどのディスプレイを開くかを指示する方法があれば、問題は解決すると思いますが、これまでのところうまくいきませんでした。

どんな助けでも大歓迎です!

4

0 に答える 0