PDA

View Full Version : مشکل اجرای همزمان دو برنامه باهم



RANGO1
دوشنبه 17 بهمن 1390, 12:10 عصر
با سلام
من یه مشکل دارم.الان با استفاده از موتکس میتونیم کاری کنیم که تنها یک نمونه از برنامه اجرا بشه.
این کار انجام میشه و به درستی کار میکنه.
ولی مشکل اینکه وقتی از این روش توی یه برنامه مجزای دیگه هم استفاده میشه موقع اجرای یکی از برنامه ها مثلا از آیکون دسکتاپ ، اگه برنامه دیگه در حال اجرا باشه ظمن اجرای برنامه اولی برنامه دومی رو هم نشون میده.
یعنی هر دو رو باهم اجرا میکنه.(من الان کاری کردم که هردو برنامه در سیستم ترای ویندوز در حال اجرا باشن ، ولی با کلیک بر روی آیکون یکی از برنامه ها در دسکتاپ برنامه دومی هم همزمان نمایش داده میشه)
تکه کدهای مورد استفاده :
در قسمت program :

static class Program
{

static Mutex mutex = new Mutex(true, "{a1f6fbc7-88a1-4d58-9468-dd9be55ab1bb}");

public static RegistryKey icontry;

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]

static void Main()
{

if(mutex.WaitOne(TimeSpan.Zero,true)) // اجرای فقط یک نمونه از برنامه با استفاده از موتکس
{

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);


var mainFormt = new Form1();

//************** اجرای برنامه در سیستم ترای
try
{

icontry = Registry.ClassesRoot.OpenSubKey("ticon", true);
icontry.GetValue("ticon1", "").ToString(); //
string value_sabticon = icontry.GetValue("ticon1").ToString(); //

if (value_sabticon == "1")
{

mainFormt.Visible = false;
mainFormt.WindowState = FormWindowState.Minimized;

}

}
catch (Exception ex)
{

MessageBox.Show(ex.Message, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Application.Run(mainFormt);

//Application.Run(new Form1());

}
else
{

NativeMethods.PostMessage((IntPtr)NativeMethods.HW ND_BROADCAST, NativeMethods.WM_SHOWME, IntPtr.Zero, IntPtr.Zero);

}


}
}




در قسمت فرم 1 یا اصلی برنامه :

protected override void WndProc(ref Message mt) // اجرای فقط یک نمونه از برنامه - نمایش برنامه مینیمایز شده
{

if (mt.Msg == NativeMethods.WM_SHOWME)
{
ShowMe();
}
base.WndProc(ref mt);
}

//*************
private void ShowMe()
{

if (WindowState == FormWindowState.Minimized)
{

if (taxiclass.pass1 == 1)
{

var form2 = new password
{
Form1InForm2 = this
};

form2.Show();

}
else
{
Show();
WindowState = FormWindowState.Maximized;

}


}

// get our current "TopMost" value (ours will always be false though)
bool topt = TopMost;
// make our form jump to the top of everything
TopMost = true;
// set it back to whatever it was
TopMost = topt;

}

b.saminjad
دوشنبه 17 بهمن 1390, 13:03 عصر
سلام

از روش زیر برای جلوگیری از اجرای مجدد برنامه استفاده کن