2009-08-05 31 views
6

Làm cách nào tôi có thể nhận được số lần chương trình trước đó đã chạy trong C# mà không cần giữ tệp và kiểm đếm. Nếu không thể như vậy, nó có thể được lấy từ Trình quản lý tác vụ theo lịch không?Chương trình đã chạy bao nhiêu lần? C#

Tới C. Ross: điều này sẽ được thực hiện như thế nào trong cài đặt đăng ký? Tha thứ cho tôi. . . cài đặt đăng ký là gì?

+0

@ "cài đặt đăng ký là gì?"- đăng ký là một tập tin được sắp xếp chứa thông tin chứa dữ liệu cấu hình và chương trình cho một bản cài đặt đã cho của Windows. Chesso cung cấp một ví dụ tốt về cách tương tác với nó bên dưới. Đừng chơi trong registry trừ khi bạn cảm thấy thoải mái, có thể tương tự như phẫu thuật não trên người nào đó đang thức giấc (tức là rất tệ) – Hardryv

+0

@Donta Cheeso có một câu trả lời tuyệt vời Tôi khuyên bạn nên sử dụng câu trả lời của họ: –

Trả lời

10

Theo hiểu biết tốt nhất, Windows không giữ thông tin này cho bạn. Bạn sẽ phải kiểm tra giá trị ở đâu đó (tệp, cơ sở dữ liệu, cài đặt đăng ký). Windows Task Scheduler là chức năng rất thấp.

+2

+1, cho một ý tưởng đăng ký nhập cảnh – nik

+0

Thực tế là nó. http://stackoverflow.com/a/6134506/3620828 – Wally

+0

@ wally Điều đó nghe có vẻ không an toàn để tích hợp. –

0

Không, người quản lý tác vụ không cung cấp loại thông tin đó. Tôi sẽ không khó để tạo ra một kịch bản mà sẽ cập nhật một kiểm đếm và sau đó thực hiện các ứng dụng và sau đó thiết lập nhiệm vụ để gọi kịch bản.

13

Tôi thực hiện việc này trong cài đặt đăng ký.

static string AppRegyPath = "Software\\Cheeso\\ApplicationName"; 
static string rvn_Runs = "Runs"; 

private Microsoft.Win32.RegistryKey _appCuKey; 
public Microsoft.Win32.RegistryKey AppCuKey 
{ 
    get 
    { 
     if (_appCuKey == null) 
     { 
      _appCuKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(AppRegyPath, true); 
      if (_appCuKey == null) 
       _appCuKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(AppRegyPath); 
     } 
     return _appCuKey; 
    } 
    set { _appCuKey = null; } 
} 

public int UpdateRunCount() 
{ 
    int x = (Int32)AppCuKey.GetValue(rvn_Runs, 0); 
    x++; 
    AppCuKey.SetValue(rvn_Runs, x); 
    return x; 
} 

Nếu đó là ứng dụng WinForms, bạn có thể móc sự kiện OnClosing của biểu mẫu để chạy UpdateCount.

+8

Tránh đăng ký của tôi! – jason

+11

Không chạy mã của tôi! – Cheeso

+2

+1 nguyên nhân của mã đã cho, rất tốt đẹp –

0

tôi khuyên bạn nên sử dụng cơ sở dữ liệu ESENT được bao gồm với Windows. Hỗ trợ phần mềm dễ dàng có sẵn với ESENT Managed Interface.

0

@Cheeso,

Bạn không cần biến thành viên riêng với mã mà, một cách để mỏng nó xuống một chút:

using Microsoft.Win32; 
public RegistryKey AppCuKey 
{ 
    get 
    { 
     return Registry.CurrentUser.OpenSubKey(AppRegyPath, true) 
      ?? Registry.CurrentUser.CreateSubKey(AppRegyPath); 
    } 
} 

Hoặc, nếu bạn muốn cập nhật biến riêng tư, để tránh gọi phương thức (là phương thức khá rẻ), bạn vẫn có thể tiết kiệm cho mình một kiểm tra nếu == null.

+0

Có tài sản trả lại thứ gì đó mà người gọi nên vứt bỏ là thiết kế cực kỳ tồi tệ. -1 – erikkallen

+0

Tôi sử dụng thuộc tính vì tôi tham khảo các cài đặt đăng ký khác ở những nơi khác. @erikkallen, tôi không thấy làm thế nào đó là một thiết kế xấu để trả lại một IDisposable từ một getter. Nó có thể là thiết kế xấu để không vứt bỏ() nó. – Cheeso

1

Bạn chỉ có thể tạo ra một application setting gọi Properties.Settings.Default.TimesRun;

Sử dụng nó như vậy:

private void Form1_Load(object sender, EventArgs e) 
{ 
    Properties.Settings.Default.TimesRun = timesrun++; 
    Properties.Settings.Default.Save(); 
} 
6

Số lượng thời gian một ứng dụng đã chạy được lưu trữ trong registry; có một số khó khăn, mặc dù:

  1. Nó được lưu trữ trong dùng registry (HKCU ví dụ) [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist]
  2. Con đường được lưu trữ trong ROT13 nên ví dụ runme.exe sẽ trở thành ehazr.rkr
  3. Sổ đăng ký thực sự lưu trữ ba giá trị dưới dạng nhị phân: thời gian chạy cuối cùng, số lần chạy (bắt đầu từ 6 thay vì 1, vì lý do nào đó) và tên của ứng dụng.

Không biết điều này có hữu ích hay không, nhưng bạn đã có nó!

+1

Tôi thực sự không thể tin được, nhưng sau khi thực hiện một tìm kiếm nhỏ cho devenv.exe trong ROT13 (đó là qrirai.rkr) tôi thực sự tìm thấy một số mục thú vị dưới '[HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ UserAssist ] '. – Oliver

+0

Chà, thật kỳ lạ. Bạn làm gì bằng cách lưu trữ nó theo cách đó? – chaz

+1

Nếu bạn đang tìm kiếm các dự án nguồn mở thực hiện giao diện này tại https://github.com/JockiHendry/ProgramExecutionCounter. Nó được viết bằng C# – Wally

0
int x = Your_Project.Properties.Settings.Default.Counter; 
x++; 
Your_Project.Properties.Settings.Default.Counter = x; 
Your_Project.Properties.Settings.Default.Save(); 
+0

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Ngoài ra, hãy cố gắng không gắn mã của bạn với các nhận xét giải thích vì điều này làm giảm khả năng đọc của cả mã và giải thích! – FrankerZ

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