2009-04-20 22 views
11

Tôi đang làm việc với C#, tôi cần có được một ví dụ cụ thể về excel bằng ID quá trình của nó; Tôi nhận được Process ID của cá thể mà tôi cần từ một ứng dụng khác nhưng tôi không biết phải làm gì khác, tôi không biết làm thế nào tôi có thể có được một cá thể đang chạy của excel cho ID tiến trình của mình.Làm cách nào để lấy cá thể Excel hoặc cá thể Excel CLSID bằng ID tiến trình?

Tôi đã nghiên cứu rất nhiều trên web, nhưng tôi chỉ thấy các ví dụ về việc sử dụng Marshal.GetActiveObject (...) hoặc Marshal.BindToMoniker (...), mà tôi không thể sử dụng kể từ lần đầu tiên trả về Ví dụ Excel đầu tiên được đăng ký trong ROT và không chính xác là cái tôi cần, và cái thứ hai yêu cầu bạn lưu tệp excel trước khi cố gắng lấy ví dụ.

Ngoài ra, nếu tôi mà có thể nhận được các CLSID của instance excel mà tôi cần, bằng cách sử dụng quá trình ID, sau đó tôi có thể gọi

GetActiveObject(ref _guid, _ptr, out objApp);

mà cuối cùng sẽ trở lại với ví dụ excel mà tôi nhu cầu.

+0

bạn có thể gửi cho tôi một mẫu làm thế nào để sử dụng phương pháp GetActiveObject – Higune

Trả lời

12

Khi bạn xác định quy trình thông qua id quá trình, bạn có thể nhận được Process.MainWindowHandle và sau đó sử dụng cùng với AccessibleObjectFromWindow API để truy cập vào mô hình đối tượng Excel cho quá trình đó.

Bài viết Getting the Application Object in a Shimmed Automation Add-in của Andrew Whitechapel mô tả kỹ thuật này chi tiết, cùng với mã mẫu.

Mã chìa khóa trong bài viết đó cho bạn bắt đầu ở dòng:

int hwnd = (int)Process.GetCurrentProcess().MainWindowHandle 

Mà trong trường hợp của bạn có thể trông giống như:

int excelId = 1234; // Change as appropriate! 
int hwnd = (int)Process.GetProcessById(excelId).MainWindowHandle 

nơi 'excelId' là số quá trình id mà bạn đang tìm kiếm. Nếu không, mã nên về cơ bản giống như được đưa ra trong bài viết. (Bỏ qua thực tế là mã của anh ấy được viết cho một bổ trợ; khía cạnh đó sẽ không ảnh hưởng đến nhu cầu của bạn ở đây, vì vậy chỉ cần bỏ qua nó.)

Nếu bạn không có id quá trình, thì bạn sẽ muốn sử dụng Process.GetProcessesByName, nhờ đó bạn có thể liệt kê từng cái một và nắm quyền kiểm soát của từng cá thể Excel với quyền truy cập vào mô hình đối tượng, nếu cần.

Hope this helps,

Mike

+0

cảm ơn bạn, đó là chính xác những gì tôi đang tìm kiếm. – Vic

+0

Không vấn đề gì, Vic, vui vì nó làm việc cho bạn. Đây không phải là một vấn đề dễ dàng và nó không được biết đến nhiều, nhưng bài viết của Andrew Whitechapel nói về nó rất tốt. Chúc may mắn! –

+1

Bài viết đã ngừng hoạt động, nhưng đây là một phần của mã tôi đã tìm thấy http://pastebin.com/F7gkrAST –

-3
using System.Diagnostics; 

    var eProcess = from p in Process.GetProcessesByName("EXCEL") 
        where p.Id == 3700 //whatever Id you have... 
        select p; 

    foreach (var process in eProcess) 
     process.Kill(); 

Điều này nhận được tất cả các quá trình có tên "EXCEL" trong đó Id tiến trình bằng một giá trị cụ thể.

+1

Cảm ơn cho câu trả lời nhanh chóng của bạn, vấn đề ở đây là tôi không tìm cách để giết chết quá trình , Tôi cần để có được ví dụ Excel để làm việc với nó, để cụ thể hơn tôi cần phải dán một số thông tin về nó. – Vic

2

Các mục nhập ROT không được gắn thẻ với CLSID. ROT trả về một DWORD từ Register, được sử dụng như một định danh cho Unregister. Tôi đã gặp vấn đề này trước đây và cách duy nhất tôi đã giải quyết nó là có một số loại bổ trợ được nạp vào mỗi Excel mà bạn có thể giao tiếp trực tiếp với.

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