2009-11-19 23 views
8

Tôi mới ở đây, vì vậy tôi không có thời gian để đóng góp trước khi tôi yêu cầu sự giúp đỡ của các bạn, vì vậy hãy tha thứ cho tôi vì điều đó.Làm cách nào để biết ứng dụng nào được mở bởi ứng dụng bất kỳ lúc nào?

Tôi không chắc chắn nếu điều này có thể được thực hiện, nhưng tôi muốn tìm ra (các) tệp đã mở của một ứng dụng.

Ở đây tôi không có nghĩa là tệp "mở" nội bộ, nhưng là những tệp được mở bởi người dùng cuối (bằng cách gọi ứng dụng xử lý thông qua tệp-assoc hoặc rõ ràng bên trong ứng dụng). Hãy nghĩ các tệp * .cs hoặc * .vb trong Visual Studio (vâng tôi là một anh chàng MS) hoặc các tệp văn bản trong Notepad.

Tôi đã xem "động từ" trong tài liệu WinDN MSDN, nhưng nó chỉ đề cập đến cách gọi và không có cách nào để kiểm tra thông tin của các động từ được gọi. Tôi cũng đã xem xét DDE, nhưng nó trông giống như một cơ sở đa năng và không phù hợp với trường hợp của tôi ở đây.

Tôi phải nói rằng hoàn cảnh của tôi rất khó để được giải quyết bằng cách Googling vì thiếu các từ khóa duy nhất, vì vậy đây chắc chắn sẽ cần sự chú ý của con người :)

Cảm ơn

+0

Chào mừng bạn đến SO.Bạn có kiểm soát được ứng dụng (tức là bạn đang phát triển ứng dụng) hay là ứng dụng đã đóng mà bạn muốn kiểm tra? –

+0

Công cụ 'màn hình' có thể phân biệt được giữa các tệp đang được mở bởi ứng dụng hoặc các tệp được người dùng của ứng dụng mở ra như thế nào? Tôi không nghĩ rằng nó có thể được mô tả. – Lazarus

+0

Vâng, tôi đã xem xét "Delphi - nhận được những tập tin được mở bởi một ứng dụng", nó đề cập đến việc sử dụng API proc NtQuerySystemInformation(), nhưng tôi đã xem các tài liệu, đó là một chức năng nội bộ hệ điều hành, và tôi không chắc chắn nếu nó tốt để sử dụng Ngoài ra còn có một ứng dụng nguyên mẫu WalkObject, nhưng sau đó tôi phải nhai tất cả các dòng mã nguồn, và tôi không muốn đi qua những đau đớn của việc đọc chúng ... BTW, tôi là một nhà phát triển C#, P/Gọi cũng là ok cho tôi –

Trả lời

3

Nếu bạn muốn kiểm tra một quy trình đang chạy cho các chốt mở, bạn có thể sử dụng ProcessExplorer hoặc ứng dụng dòng lệnh Handle.

ProcessExplorer thực chất là Trình theo dõi tác vụ của Windows trên các steroid. Đó là một công cụ rất hữu ích trong tính toán hàng ngày, cũng như gỡ lỗi quy trình. Tôi khuyên bạn nên nó.

+0

Tôi nghĩ rằng thách thức ở đây là anh ta chỉ muốn các tập tin được mở bởi người dùng bằng phần mềm không phải bất kỳ tệp ứng dụng nào được khởi tạo mở, tức là .docx không phải dll, các tệp tạm thời, v.v. – Lazarus

+0

Bạn có thể lọc các yêu cầu đó trong Process Explorer . –

0

Có một tiện ích được tìm thấy trong SysInternals mà có thể liệt kê các tập tin được mở bởi một ứng dụng Link đây

+0

PsFile sẽ là một trong những bạn đang tìm kiếm – t0mm13b

+0

Cảm ơn, nhưng tôi muốn làm như vậy lập trình, vì vậy đây có thể không phải là công cụ phù hợp với tôi –

0

Một một cách nhanh chóng mà chỉ hoạt động cho tập tin khóa là một phần mở rộng vỏ gọi là WhoLockMe. Nó không phải là mạnh mẽ như một số các công cụ khác ở đây, nhưng đó là một menu ngữ cảnh đi trong Windows explorer.

1

Tôi cho rằng bạn là lập trình viên C# và muốn một số mã để thực hiện việc này. Theo như tôi biết, không có API lập trình dễ dàng để tìm hiểu thông tin này - nó không phải là API Win32, mà là API nội bộ của Windows. Tuy nhiên, bộ tiện ích dòng lệnh SysInternals (http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx) có thể được sử dụng để tìm hiểu thông tin này.

Ứng dụng bạn muốn được gọi là Xử lý.

Sẽ không có sự khác biệt đối với HĐH giữa những gì bạn gọi là "tệp nội bộ" (có lẽ là những tệp được mở bởi chương trình mà không có sự tham gia của người dùng) và người dùng cố ý sử dụng. Bạn sẽ phải cung cấp thông tin này bằng cách chỉ định phần mở rộng của tệp. Ví dụ: nếu bạn muốn tìm tất cả các tệp mở trong Word, dòng lệnh bạn cần là:

handle -p winword.exe | tìm ".doc"

Nếu viết một ứng dụng trong C#, bạn có thể sử dụng lớp sau để trả về danh sách tài liệu mở khớp với mẫu của bạn (lưu ý điều này có chứa một biểu mẫu gọi là ShowOpenAppFilesForm, với hai hộp văn bản appExeNameTextBoxfileExtensionTextBox và hộp danh sách openFileListBox):

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Drawing; 
using System.IO; 
using System.Text; 
using System.Windows.Forms; 

namespace ShowOpenAppFiles 
{ 
public partial class ShowOpenAppFilesForm : Form 
{ 
    private const string HandlePath = @"D:\Development\SysInternals\SysinternalsSuite\Handle.exe"; 

    public ShowOpenAppFilesForm() 
    { 
    InitializeComponent(); 
    } 


    private void showButton_Click(object sender, EventArgs e) 
    { 
    string[] fileExtensions = new string[1]; 
    fileExtensions[0] = fileExtensionTextBox.Text; 
    openFileListBox.DataSource = Show(appExeNameTextBox.Text, fileExtensions); 
    } 

    private List<string> Show(string programExeName, string[] fileExtensions) 
    { 
    Process childProcess = new Process(); 
    ProcessStartInfo startInfo = childProcess.StartInfo; 
    startInfo.FileName = HandlePath; 
    startInfo.Arguments = " -p " + programExeName; 
    startInfo.CreateNoWindow =false; 
    startInfo.ErrorDialog = false; 
    startInfo.RedirectStandardOutput = true; 
    startInfo.UseShellExecute = false; 

    childProcess.Start(); 

    StreamReader stdOutput = childProcess.StandardOutput; 

    List<string> fileNameList = new List<string>(); 

    while (!stdOutput.EndOfStream) 
    { 
    string line = stdOutput.ReadLine(); 
    for (int i = 0; i < fileExtensions.Length; i++) 
    { 
    if (line.Contains("." + fileExtensions[i])) 
    { 
     fileNameList.Add(line.Substring(21)); 
    } 
    } 
    } 
    childProcess.WaitForExit(); 

    return fileNameList; 
    } 
} 
} 

[Ngẫu nhiên, DDE chủ yếu là bánh mì nướng bây giờ.]

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