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 にどのディスプレイを開くかを指示する方法があれば、問題は解決すると思いますが、これまでのところうまくいきませんでした。
どんな助けでも大歓迎です!