SORU
21 AĞUSTOS 2008, PERŞEMBE


Tek örnek bir uygulama oluşturmak için doğru yolu nedir?

C# ve WPF .net (WindowsForms veya konsol yerine), sadece tek bir örnek olarak çalıştırılabilir bir uygulama oluşturmak için doğru yolu nedir? Efsanevi bir şey bir zaman uyumu denen bir şey olduğunu biliyorum, bu nadiren bir şeyi bırakın ve açıklamak için rahatsız eden birini bulabilirim.

Kod da kullanıcı ikinci bir başlangıç yapmaya çalıştım zaten çalışan örneği bildirmeniz gerekir, ve belki de, eğer herhangi bir var Eğer herhangi bir komut satırı argümanları.

CEVAP
7 ŞUBAT 2009, CUMARTESİ


Burada çok iyi article zaman uyumu ile ilgili bir çözüm. Bu yaklaşım, bu makalede açıklanan iki nedenden dolayı avantajlıdır.

İlk olarak, Microsoft bağımlılık gerektirmez.VisualBasic derleme. Eğer benim projem zaten derleme bir bağımlılık olsaydı, muhtemelen savunucusu yaklaşımı kabul cevabı gösterildiği kullanıyorum. Ama, Microsoft kullanmıyorum.Montaj VisualBasic ve oldukça projem için gereksiz bir bağımlılık eklemek istemiyorum.

İkinci olarak, makale kullanıcı başka bir örneğini başlatmak için çalıştığında ön plana uygulama varolan örneği getirmek için nasıl gösterir. Diğer kullanılabilir çözümler burada anlatılan hitap eden çok hoş bir dokunuş.


GÜNCELLEME

8/1/2014, makale olarak hala aktif olduğunu yukarıda bağlı, ama bu blog bir süre içinde güncellenmiş edilmemiştir. Sonunda yok diye beni merak etme, ve öyle bir savundu çözüm yapar. Burada yazı içeriği gelecek kuşaklar için üreyen ediyorum. Kelimeleri sadece Sanity Free Coding blog sahibine aittir.

Bugün başvurum yasak bazı kod yeniden istedim kendisi çalışan birden çok örneği.

Daha önce bir Ara 12* *ihtiyacım vardı işlem listesinde benim myapp.exe örneği. Bu işleri yaparken, çok yük getirir, ve bir süpürge istedim.

Ben bilmek bunun için bir dışlama (kullanıma sahip önce) benim kod kısmak ve hayatımı kolaylaştırmak için yola çıktım.

Uygulama benim ana sınıfındaki bir statik Mutex adlı yarattım:

static class Program
{
    static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
    [STAThread]
    ...
}

Adlı bir dışlama olması bizi eşitleme boyunca yığın sağlar hemen bakıyorum, sihirli olan birden çok iş parçacığı ve işlemlerin için.

Mutex.WaitOne bizim için süreyi belirten bir aşırı yüklenme var beklemek. Aslında bizim kodunu senkronize etmek isteyen olmadığımız (eğer şu anda ise sadece kontrol) aşırı yük ile kullanıyoruz iki parametre: Mutex.WaitOne(Timespan timeout, bool exitContext). Eğer öyle olmasaydı eğer girmek mümkün, ve eğer yanlış bir doğru verir bekle. Bu durumda, eğer bizim zaman uyumu olmak İse hiç beklemek istiyorum; bilmiyoruz eskiden, skip, devam, zaman aralığı içinde geçirmek.Sıfır (0 bekle milisaniye) çıkış, ve exitContext ayarlamak true senkronizasyon üzerinde bir kilit elde etmek için çalışıyoruz önce içerik. Kullanma bu, bizim Uygulama sarın.Böyle bir şey içinde kod çalıştırmak

static class Program
{
    static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
    [STAThread]
    static void Main() {
        if(mutex.WaitOne(TimeSpan.Zero, true)) {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            mutex.ReleaseMutex();
        } else {
            MessageBox.Show("only one instance at a time");
        }
    }
}

Bizim app çalışıyor, WaitOne yanlış döndürür, ve alacağız eğer öyleyse, bir mesaj kutusu.

Bir mesaj kutusu göstermek yerine, küçük bir win 32 kullanmaya karar verdim birileri olduğunu unuttum benim çalışan örneği bildir çalışan (tüm diğer pencerelerin üstüne kendisi getirerek). İçin PostMessage her özel mesaj yayın için kullandım bunu başarmak pencere (özel mesaj RegisterWindowMessageile tescil edildi başvurum ne bilir tek bir anlamı var benim çalışan uygulama tarafından bundan sonra benim ikinci örnek çıkar. Çalışan uygulama örneği bu bildirim almak ve bu süreci olacaktır. Bunu yapmak için, ben benim ana formu WndProc bozdu ve benim için özel dinledi bildirim. Ne zaman bir bildirim aldım ben form kümesi True özellik Yukarı getirmek için, en üstteki.

Ben ile sona erdi:

  • Program.cs
static class Program
{
    static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
    [STAThread]
    static void Main() {
        if(mutex.WaitOne(TimeSpan.Zero, true)) {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            mutex.ReleaseMutex();
        } else {
            // send our Win32 message to make the currently running instance
            // jump on top of all the other windows
            NativeMethods.PostMessage(
                (IntPtr)NativeMethods.HWND_BROADCAST,
                NativeMethods.WM_SHOWME,
                IntPtr.Zero,
                IntPtr.Zero);
        }
    }
}
  • NativeMethods.cs
// this class just wraps some Win32 stuff that we're going to use
internal class NativeMethods
{
    public const int HWND_BROADCAST = 0xffff;
    public static readonly int WM_SHOWME = RegisterWindowMessage("WM_SHOWME");
    [DllImport("user32")]
    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
    [DllImport("user32")]
    public static extern int RegisterWindowMessage(string message);
}
  • Form1.cs (ön tarafı kısmi)
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    protected override void WndProc(ref Message m)
    {
        if(m.Msg == NativeMethods.WM_SHOWME) {
            ShowMe();
        }
        base.WndProc(ref m);
    }
    private void ShowMe()
    {
        if(WindowState == FormWindowState.Minimized) {
            WindowState = FormWindowState.Normal;
        }
        // get our current "TopMost" value (ours will always be false though)
        bool top = TopMost;
        // make our form jump to the top of everything
        TopMost = true;
        // set it back to whatever it was
        TopMost = top;
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • Attempts at least

    Attempts at

    1 Ocak 2007
  • kylelandry

    kylelandry

    9 AĞUSTOS 2007