2012-07-06 35 views
5

Tôi muốn có thể nhúng bản trình bày powerpoint vào biểu mẫu C# (WinForms). Về cơ bản chúng ta có một màn hình 52 ', và ý tưởng là ở một góc chúng ta sẽ có một vòng lặp PPT, và sau đó 3 góc khác sẽ hiển thị thông tin từ chính chương trình đó.Nhúng chương trình Powerpoint vào ứng dụng C#

Tôi đã mong đợi điều này đơn giản, nhưng có vẻ như tôi đã nhầm lẫn.

Tôi đã được khuyên sử dụng điều khiển WebBrowser, nhưng điều này không hoạt động và thay vào đó xử lý tệp powerpoint dưới dạng tải xuống, tức là cung cấp cho tôi hộp thoại "Lưu, mở".

Mọi đề xuất?

AK

+1

ứng dụng của bạn có tương tác với bản trình bày không? bạn có thể làm với việc chạy ppt trong máy ảo nếu không ... – Adam

+1

Xem http: // stackoverflow.com/questions/10955496/powerpoint-2010-multiple-instances/11737090 # 11737090 – TFD

Trả lời

8

Bạn chỉ có thể chạy PowerPoint, xử lý cửa sổ và đặt cửa sổ mẹ mới bằng chức năng SetParent.


Tất cả bạn cần là tên của lớp cửa sổ của cửa sổ PowerPoint, nhưng nhờ Spy++, đây không phải là vấn đề lớn.

spy++


Dưới đây là một ảnh chụp màn hình của PowerPoint chạy 'bên trong' của một ứng dụng tùy chỉnh:

PowerPoint


Full dụ (lấy từ here và sửa đổi cho PowerPoint):

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     this.Size = new System.Drawing.Size(800, 600); 
     this.TopMost = true; 
     this.Text = "My Application"; 
     this.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
     Func<bool> run =() => 
      Window.Find(hwnd => 
      { 
       var cn = Window.GetClassName(hwnd); 
       var res = (cn == "PPTFrameClass"); 
       if (res) 
       { 
        this.Controls.Clear(); 
        Window.SetParent(hwnd, this.Handle); 
        Window.SetWindowPos(hwnd, new IntPtr(0), -8, -30, this.Width + 10, this.Height + 37, 0x0040); 
       } 
       return res; 
      }); 

     new Button { Parent = this, Text = "Start" } 
      .Click += (s, e) => 
      { 
       if (run() == false) 
        MessageBox.Show("Open PowerPoint"); 
      }; 
    } 
} 

public static class Window 
{ 
    public static bool Find(Func<IntPtr, bool> fn) 
    { 
     return EnumWindows((hwnd, lp) => !fn(hwnd), 0) == 0; 
    } 
    public static string GetClassName(IntPtr hwnd) 
    { 
     var sb = new StringBuilder(1024); 
     GetClassName(hwnd, sb, sb.Capacity); 
     return sb.ToString(); 
    } 
    public static uint GetProcessId(IntPtr hwnd)  // {0:X8} 
    { 
     uint pid; 
     GetWindowThreadProcessId(hwnd, out pid); 
     return pid; 
    } 
    public static string GetText(IntPtr hwnd) 
    { 
     var sb = new StringBuilder(1024); 
     GetWindowText(hwnd, sb, sb.Capacity); 
     return sb.ToString(); 
    } 

    delegate bool CallBackPtr(IntPtr hwnd, int lParam); 

    [DllImport("user32.dll")] 
    static extern int EnumWindows(CallBackPtr callPtr, int lPar); 

    [DllImport("user32.dll")] 
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); 

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); 

    [DllImport("User32", CharSet = CharSet.Auto, ExactSpelling = true)] 
    public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent); 

    [DllImport("user32.dll", SetLastError = true)] 
    public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int W, int H, uint uFlags); 
} 
+0

Điều này thật tuyệt, nhưng sẽ có cách tương tự để chỉ chạy trình chiếu, thay vì toàn bộ môi trường? – KingCronus

+0

Có một cài đặt trong PowerPoint để chạy trình chiếu ở chế độ cửa sổ thay vì toàn màn hình. Sau đó, nó sẽ trông giống như [this] (http://imagebin.org/220050). Có lẽ đó là đủ để làm cho bạn hạnh phúc :-) – sloth

+0

Tôi tin rằng bạn cũng có thể chỉ hiển thị phần trượt của cửa sổ PowerPoint. Bạn sẽ phải sử dụng [GetDlgItem] (http://msdn.microsoft.com/en-us/library/ms645481 (VS.85) .aspx) để có được điều khiển con 'MDIClient' của cửa sổ PowerPoint, và sau đó nhận điều khiển '" Slide "paneClassDC' từ điều khiển đó. Nhưng tôi đã không thử nghiệm điều này. – sloth

0

Tôi thực sự không có ý tưởng rằng có thể nhúng trình xem ppt vào biểu mẫu thắng. Tôi có một gợi ý khác cho bạn: Sử dụng điều khiển trình duyệt (hoặc tải xuống một cho webkit nếu bạn muốn hỗ trợ html5 tốt hơn) và sử dụng thư viện js như impress.js để trình bày bản trình bày. Chỉ là một ý nghĩ.

xem
+0

Thật không may cho tôi trong trường hợp này khách hàng đang cung cấp powerpoint, và họ cần để có thể thay đổi nó thường xuyên và dễ dàng với powerpoint. – KingCronus

+0

Impress.js có vẻ thú vị, tôi có thể phải thử nó cho một thứ khác! – KingCronus

2

Một PowerPoint mà là một điều khiển Active/X nhúng nên con đường để đi - bạn có thể thử this (rõ ràng là nó không hoạt động - xem ý kiến) hoặc this

Xem this cho nhúng Active/X điều khiển trong ứng dụng Windows Forms

Nếu cửa sổ nơi bạn có kế hoạch để hiển thị PowerPoint không thay đổi kích thước mà bạn cũng có thể chuyển đổi các slide PowerPoint thành bitmap, và sau đó chỉ cần hiển thị bitmap

+0

Hãy thử như tôi có thể, tôi đã không thể có được điều khiển ActiveX để làm việc. Đó là ngày 2007 và tôi tự hỏi nếu nó hoạt động ở tất cả. Đối với Bitmap, đó sẽ là một nỗi đau vì ý tưởng là người dùng cuối sẽ có thể cập nhật Powerpoint mà không gặp quá nhiều rắc rối. – KingCronus

+0

Tôi đã không thử Active/X kiểm soát bản thân mình - có vẻ như cách để đi với tôi, có bạn đã cố gắng để tìm những người khác (Googling nó trả về một số hits - tôi thêm một liên kết đến câu trả lời của tôi)? Liên quan đến mẹo 'bitmap', có thể viết kịch bản PowerPoint để tự động tạo bitmap. – MiMo

+0

cảm ơn sự hỗ trợ, nhưng mọi điều khiển tôi đã tìm thấy hoặc là a) không hoạt động với Powerpoint 07 trở đi hoặc chi phí một số tiền rất lớn. Bên cạnh đó, tôi không thực sự muốn phải sử dụng ActiveX nếu tôi có thể giúp nó. – KingCronus

0

Originally posted by @danish, here.

Xem trang này link. Bạn cũng có thể hiển thị ppt trong điều khiển WebBrowser. This cũng có thể hữu ích.

Về cơ bản, nó cũng cho phép bạn mở ppt, trong điều khiển WebBrowser mà bạn có thể nhúng dễ dàng. Hãy cho tôi biết nếu bạn cần thêm thông tin về nó.

Các vấn đề liên quan