2013-08-21 41 views
8

Tôi đã thêm ứng dụng của tôi vào menu chuột phải của Windows với sự giúp đỡ của registryNhận nhiều tập tin đường dẫn với Right Click

"C: //myapp.exe "% 1"

tôi có thể lấy đường dẫn của file được chọn trong một MessageBox sử dụng mã dưới đây.

static void Main(string[] args) 
{ 
    foreach (string path in args) 
    { 
     MessageBox.Show(path); 
    } 
} 

It is okay nếu tôi muốn mở một tập tin duy nhất, nhưng nếu tôi chọn nhiều file, nó chạy nhiều phiên bản ứng dụng của tôi. Tôi cần đường dẫn của tất cả các tệp được chọn trong một cá thể duy nhất. Bất cứ ai có thể cho tôi một ý tưởng làm thế nào để làm điều này?

+0

Có vấn đề gì? bạn cần nhiều đối số được truyền vào? – Sayse

+0

Không có cách nào tôi biết để phân biệt "nhiều lựa chọn, nhấp chuột phải, khởi chạy" từ "chọn, nhấp chuột phải, khởi chạy, chọn khác, nhấp chuột phải, khởi chạy" - vì vậy nếu bạn hài lòng, trong cả hai trường hợp, chỉ cho một cá thể đơn lẻ đang chạy, bạn đang tìm cách triển khai một "ứng dụng cá thể đơn lẻ" - hãy thử tìm kiếm ba từ đó cộng với C#. –

+1

bản sao có thể có của [Mở tất cả các tệp khi người dùng nhấp chuột phải và chọn "Mở bằng"] (http://stackoverflow.com/questions/3158312/open-all-files-when-user-right-clicks-and-selects- open-with) –

Trả lời

0

Trước hết, điều quan trọng nhất mà tôi muốn nói với bạn về cách tiếp cận của bạn là hoàn toàn không thể lấy nhiều đường dẫn tệp bằng phím tắt Nhấp chuột phải bạn đã thực hiện với sổ đăng ký. Tuy nhiên, có một số cách giải quyết cách tiếp cận này có thể hữu ích;

  • Nếu bạn thực sự cần điều này đơn giản sau đó bạn sẽ phải đối phó với các trường hợp ứng dụng sử dụng Mutex Class .Đây có thể cung cấp cho bạn một số giúp đỡ nếu bạn quản lý để hạn chế ví dụ ứng dụng của bạn để sử dụng duy nhất Mutex.To có được phương pháp này để làm việc cho bạn, bạn sẽ phải vượt qua các đối số dòng lệnh từ tất cả các cá thể trước đó cho cá thể cuối cùng.

Phương pháp tôi giải thích hiện nay liên quan đến rất nhiều mã để có được tất cả đường dẫn tệp trong khi khởi động, tuy nhiên phương pháp thứ hai dễ dàng nhất là phù hợp với tình huống này, nhưng hơi khó và đòi hỏi nhiều hơn thực thi của bạn.

  • Cách tiếp cận thứ hai (được khuyến nghị) là một chút khó khăn vì nó liên quan đến việc tạo thành phần bổ sung với ứng dụng của bạn để nhận tất cả đường dẫn tệp, nhưng nó đảm bảo rằng bạn nhận được tất cả đường dẫn một lần (không nhiều trường hợp) Cách tiếp cận thứ hai có thể có tiêu đề là Tiện ích mở rộng của Shell. Để giải thích cách tiếp cận này, hãy để tôi giải thích một số điều kiện tiên quyết (và đừng ngần ngại bỏ qua nếu bạn đã biết) .Shell Extensions là COM Servers, được đăng ký trên máy tính của người dùng với một số loại tệp cụ thể mà họ có thể xử lý nói cs, csproj (cả hai đều đã đăng ký sẽ được mở với Visual Studio theo mặc định) .Shell Extensions còn được gọi là Context menu Handlers .A đăng ký shell extension hoặc ContextMenu handler được gọi càng sớm càng mở rộng tập tin đăng ký được mở ra với nó nhận được một nhấp chuột phải từ contextmenu của Windows Explorer.
    Nói chung một phần mở rộng của trình bao hoặc trình xử lý contextmenu là một COM Server đã đăng ký thoát ở dạng Dynamic Link Library trong máy tính của người dùng và các chức năng của nó được gọi nếu kiểu tệp đã đăng ký nhận được nhấp chuột phải hoặc nhấp đúp.
    Vì vậy, với điều đó, tôi đoán bạn đã có đủ để tạo ra một khởi đầu tốt cho Shell Extensions. Here là một bài viết từng bước tốt đẹp để cung cấp cho bạn một nửa với một điểm khởi đầu tốt.

Tôi đoán điều đó sẽ giúp bạn đạt được nhu cầu của mình. Nếu có gì còn lại, vui lòng cho tôi biết.

0

Trong khi nó phức tạp hơn nhiều, tôi biết rằng Trình xử lý mở rộng Shell sẽ giải quyết vấn đề này.
How to Write Windows Shell Extension with .NET Languages

Tôi đã viết một trong các ứng dụng này cho ứng dụng biểu mẫu cửa sổ mở ra khi người dùng nhấp chuột phải vào một loại tệp cụ thể. Nó cũng hoạt động với nhiều tệp.

Chúc may mắn!

1

Một phi lập trình công việc xung quanh, để sao chép tất cả các đường đồng thời là như sau (đã kiểm tra tại Windows 7):

  1. Chọn các tập tin mà bạn muốn.
  2. Shift + Nhấp chuột phải.
  3. Nhấp vào "Sao chép dưới dạng đường dẫn" (nó xuất hiện dưới dạng tùy chọn bổ sung!).

Tất cả đường dẫn được sao chép như mong đợi!

0

Ứng dụng của bạn rất có thể không chạy nhiều phiên bản của chính nó, bạn chỉ đơn giản nhận được nhiều hộp thư kể từ khi bạn yêu cầu vòng lặp foreach hiển thị hộp thư với mỗi đường dẫn. Bạn cần thao tác một chuỗi để chứa tất cả các đường dẫn và sau đó chèn chúng vào hộp thông báo để hiển thị.

TỪ

static void Main(string[] args) 
{ 
    foreach (string path in args) 
    { 
     MessageBox.Show(path); 
    } 
} 

ĐẾN

static void Main(string[] args) 
{ 
    string paths = ""; 
    foreach (string path in args) 
    { 
    paths += path + Environment.NewLine; 
    } 
    MessageBox.Show(path); 
} 
1

Tôi đã thử nó và các ứng dụng đang chạy một thể hiện mới cho mỗi tập tin được chọn. Tôi thậm chí đã cố gắng thêm "% 2" "% 3" vv vào lệnh đăng ký, điều đó cũng không hoạt động.

Nếu thực sự cần thiết để chạy một cá thể cho tất cả các tệp, có thể bạn có thể thiết lập ứng dụng của mình như với một lớp bắt nguồn từ WindowsFormsApplicationBase, đặt thuộc tính IsSingleInstance và ghi đè OnStartupNextInstance (không liên kết đến điều đó vì danh tiếng của tôi không cho phép nhiều hơn 2 liên kết)

+0

Đây là ví dụ điển hình cho [ứng dụng cá thể đơn lẻ trong C#] (http://www.codeproject.com/Articles/12890/Single-Instance-C-Application-for-NET) –

+0

Vâng, đây là con đường để đi.Không có điểm nào trong việc phát hiện các cá thể ứng dụng mới và xử lý giao tiếp giữa các cá thể đó. Lưu ý: Bạn sẽ cần tham chiếu đến * 'Microsoft.VisualBasic.dll' * và' sử dụng Microsoft.VisualBasic.ApplicationServices; ' –

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