Nasıl iki zaman arasındaki farkı hesaplayacağınızı ve bu zamanları nasıl program kapansa dahi elinizde tutacağınız basit bir mantığı yorum satırları ile proje üzerinde detaylıca anlattım.

Proje Bağlantıları:

Proje
VirusTotal


İndirmek istemeyenler için tüm source:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CheckTime
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Programın Çalıştığı Dosyanın Konumu:
string program_directory = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
//Kaydedilecek Dosya Adı ve Uzantısı (Uzantı size kalmıştır dilediğiniz gibi uzantı kullanabilirsiniz isterseniz .adınız yapın hiç fark etmez.):
string filename = @"/checktime.sefa";
private void btn_OpenForm2_Click(object sender, EventArgs e)
{
//Yeni bir StreamWriter oluşturup belirlediğimiz dosya yoluna ve adına yazmasını belirtiyoruz:
StreamWriter sw = new StreamWriter(program_directory+filename);
//Ve son olarak bu dosyaya yazacağı şeyi yani Form2'nin açılış tarihini yazdırıyoruz
//Bu butona basılınca Form2 yi açacağından basıldığı zaman Form2'nin açılış zamanıdır. Dolayısıyla DateTime.Now (Şuan) çekmemiz yeter:
sw.Write(DateTime.Now.ToString());
sw.Dispose();
//Şimdi de Form2 yi oluşturup açıyoruz:
Form Form2 = new Form
{
Text = "2. Form",
ShowIcon = false
};
Form2.Show();
}

private void Form1_Load(object sender, EventArgs e)
{
//Burada ana form yüklenirken progrmaın dosya yolunda bir checktime.sefa dosyası olup olmadığını kontrol edip eğer varsa içindeki zamanı çektireceğiz.
//Ve daha sonra çektiğimiz o zaman ile Form2'yi açan butonun tekrar aktif olması için istediğimiz zaman farkı şartını belirteceğiz.

//Dosyanın olup olmadığını bilmediğimiz için bunu try catch ile gerçekleştireceğiz. Dosyayı başka türlü kontrol etme şansımızda var,
//fakat zaten try catch işimizi yeterince görüyorken başka bir kütüphane importlayıp kasmaya gerek yok.
try
{
//StreamReaderımızı oluşturup programın konumundaki checktime.sefa dosyasını okuması için hazırladık.
StreamReader sr = new StreamReader(program_directory + filename);
//Okuyacağı veri String olduğu için DateTime olarak çevirdik ve dt adlı bir DateTime'ın içine attık.
DateTime dt = Convert.ToDateTime(sr.ReadLine());
//Form2'nin açılış tarihini formdaki labela yazdırdık:
lab_time.Text = dt.ToString();
//Form2'nin tekrar açılması için kalan süreyi formdaki labela yazdırdık:
// Math Round ile 2 saat arasındaki çıkan sonucun ondalık değerini 2 basamağa indirgedik:
lab_remaining.Text = Math.Round((24 - (DateTime.Now - dt).TotalHours),2).ToString() + " Saat";
//Bir if kontrolü ile açılış zamanı ile şuan arasında 24 saat olup olmadığını kontrol ettik:
if ((DateTime.Now - dt).TotalHours < 24)
{
//Açılış tarihi ile şuan arasındaki toplam saat 24 den küçük ise. Yani 24 saat geçmemişse Form2 yi açamaması için
//Butonun enabled değerini false yaptık.
btn_OpenForm2.Enabled = false;
}
else
{
//Açılış tarihi ile şuan arasındaki toplam saat 24 den küçük değilse. Yani 24 saat geçmişse Form2 yi tekrar açabilmesi için
//Butonun enabled değerini true yaptık.
btn_OpenForm2.Enabled = true;
//Ve checktime.sefa dosyasını sildirerek yeni giriş için hazır hale getiriyoruz:
File.Delete(program_directory + filename);
}


}
catch (Exception) //StreamReader'ın okuyacağı dosya yok ise;
{
//StreamReader'ın okuyacağı dosya yani zaman dosyası yok ise daha önce Form2 açılmamış demektir. Bu nedenle Form2 yi açmasına izin verip,
//Enabled değerini true yapıyoruz.
btn_OpenForm2.Enabled = true;
}

}
}
}



Dip not: Dileyenler try cacth yerine if ile File.Exit() kontrolü de yapabilir.