मेरे पास एक ऐसा एप्लिकेशन है जिसमें एक समय में स्वयं का एक उदाहरण खुल सकता है। इसे लागू करने के लिए, मैं इस कोड का उपयोग करता हूं:मैं एक विदेशी विंडो कैसे केंद्रित करूं?
System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses();
System.Diagnostics.Process me = System.Diagnostics.Process.GetCurrentProcess();
foreach (System.Diagnostics.Process p in myProcesses)
{
if (p.ProcessName == me.ProcessName)
if (p.Id != me.Id)
{
//if already running, abort this copy.
return;
}
}
//launch the application.
//...
यह ठीक काम करता है। मैं इसे पहले से चल रही प्रति के रूप पर ध्यान केंद्रित करने में सक्षम होना चाहूंगा। यही है, लौटने से पहले, मैं इस आवेदन का दूसरा उदाहरण अग्रभूमि में लाना चाहता हूं।
कैसे मैं ऐसा क्यों है?
पुन: SetForeGroundWindow:
SetForeGroundWindow, काम करता है एक बिंदु के लिए:
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
//...
if (p.Id != me.Id)
{
//if already running, focus it, and then abort this copy.
SetForegroundWindow(p.MainWindowHandle);
return;
}
//...
इस अग्रभूमि करने के लिए खिड़की लाना पड़ता अगर यह कम से कम नहीं है। बहुत बढ़िया। यदि विंडो कम हो गई है, हालांकि, यह कम हो गई है।
इसे कम से कम करने की आवश्यकता है। SwitchToThisWindow के माध्यम से
समाधान (वर्क्स!):
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
[STAThread]
static void Main()
{
System.Diagnostics.Process me = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcessesByName(me.ProcessName);
foreach (System.Diagnostics.Process p in myProcesses)
{
if (p.Id != me.Id)
{
SwitchToThisWindow(p.MainWindowHandle, true);
return;
}
}
//now go ahead and start our application ;-)
जांच करें, कहीं खिड़की IsIconic, यदि ऐसा है तो ShowWindow http://msdn.microsoft.com/en-us/library/ms633527(VS.85).aspx http फोन: // MSDN। microsoft.com/en-us/library/ms633548(VS.85)।एएसपीएक्स – cmsjr