作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个应用程序,它一次只能打开一个自身实例。为了强制执行此操作,我使用以下代码:
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 在某种程度上有效:
[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 ;-)
}
最佳答案
我遇到了同样的问题 SwitchToThisWindow()对我来说效果最好。唯一的限制是您必须安装 XP sp1。我玩过 SetForegroundWindow、ShowWindow,它们都无法将窗口拉入 View 。
关于c# - 我如何聚焦外国窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/444430/
我有一个问题,我只是不知道如何解决。我想在 JAVA 中建模一个结构,例如:公司、 Activity 和地点。 每个公司都包含一个或多个位置,代表该公司的分支机构所在的位置 每个事件还有一个事件发生的
我是一名优秀的程序员,十分优秀!