如何将我的WPF应用程序带到桌面的前端?到目前为止,我已经尝试过:
SwitchToThisWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle, true);
SetWindowPos(new WindowInteropHelper(Application.Current.MainWindow).Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle);
Run Code Online (Sandbox Code Playgroud)
这些都没有Marshal.GetLastWin32Error()成功(说这些操作成功完成,每个定义的P/Invoke属性都有SetLastError=true).
如果我创建一个新的空白WPF应用程序,并SwitchToThisWindow使用计时器调用,它完全按预期工作,所以我不知道为什么它不能在我的原始情况下工作.
编辑:我正在与全球热键一起做这个.
我有一个窗口应用程序.当我最小化任务栏上的窗口应用程序以在另一个应用程序上工作.我们有一个设施,如从一个窗口应用程序发送消息到另一个窗口应用程序
所以我的第一个获胜应用程序是最小化,现在我打开我的另一个获胜应用程序,然后发送消息到第一个应用程序,但第一个应用程 所以我想要的功能就像任何消息捕获我的第一个应用程序然后它会像skype或任何信使一样闪烁.
我曾尝试过User32.dll的"FlashWindowEx"方法.但没有运气.我试过选择"连续闪光直到窗口到达前景".但没有运气.
请举例帮助解决这个问题
谢谢
我正在用C#编写Windows窗体应用程序.我需要能够把它带到前台.经过一些谷歌搜索和实验,我有一个看起来非常hacky的工作解决方案.
如果有的话,我想知道这样做的优雅方式.我需要应用程序恢复并前往前台,无论它是最小化,还是最小化,但在后台.
当前代码如下所示:
WindowState = FormWindowState.Minimized;
WindowState = FormWindowState.Normal;
BringToFront();
Focus();
Run Code Online (Sandbox Code Playgroud) 伙计们,
请问有没有人知道如何从一个看不见的应用程序中显示一个表单,并让它获得焦点(即出现在其他窗口的顶部)?我在C#.NET 3.5中工作.
我怀疑我采取了"完全错误的方法"......我没有 Application.Run(新的TheForm())而不是我(新的TheForm()).ShowModal() ... Form基本上是一个模态对话,带几个复选框; 文本框,以及确定和取消按钮.用户勾选一个复选框并输入描述(或其他),然后按OK,表单消失,进程从表单中读取用户输入,处理它,然后继续处理.
这是有效的,除非表单显示它没有得到焦点,而是它出现在"主机"应用程序后面,直到你在任务栏中点击它(或其他).这是一个最烦人的行为,我预测会导致许多"支持调用",而现有的VB6版本没有这个问题,所以我在可用性方面倒退了...用户不会接受(并且也不应该).
所以...我开始认为我需要重新考虑整个shebang ...我应该预先显示表单,作为"正常应用程序"并将处理的剩余部分附加到OK按钮单击事件.它应该工作,但这需要时间,我没有(我已经超过时间/预算)...所以首先我真的需要尝试使当前的方法工作...即使快速和 - 脏的方法.
所以,请有人知道如何"强制".NET 3.5表格(通过公平的方式或家禽)来获得焦点?我在想"魔术"的Windows API调用(我知道
Twilight Zone:这似乎只是工作中的一个问题,我们正在Windows XP SP3上使用Visual Studio 2008 ...我刚刚无法在家中使用SSCCE(见下文)重现问题关于Vista Ulimate的C#2008 ......这很好用.咦?WTF?
另外,我发誓昨天在工作时显示了我运行EXE时的表格,但不是直接从IDE(我刚刚忍受的)F5'(或Ctrl-F5'ed)时... ...在家里表单显示正常.Totaly confusterpating!
它可能相关,也可能不相关,但Visual Studio今天早上在调试模式下运行并"动态"编辑代码时崩溃并烧毁...它被卡住了我认为是无限循环的错误消息.错误消息是关于"无法调试此项目,因为它不是当前项目,或者其他东西......所以我只是使用进程资源管理器将其杀死.它再次启动,甚至提供恢复"丢失"文件,我接受的报价.
using System;
using System.Windows.Forms;
namespace ShowFormOnTop {
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
Form1 frm = new Form1();
frm.ShowDialog();
}
}
}
Run Code Online (Sandbox Code Playgroud)
背景:我正在将现有的VB6实现移植到.NET ...它是一个名为MapInfo的"客户端"GIS应用程序的"插件" .现有客户"无形地工作",我的指示是"尽可能保持新版本与旧版本尽可能接近",这很好(经过多年的修补); 它只是用不支持的语言编写的,所以我们需要移植它.
关于我:我通常都是C#和.NET的菜鸟,虽然我有一个底部擦拭证书,我已经是一名专业程序员已经10年了; 所以我有点"知道一些东西".
任何见解都是最受欢迎的......谢谢大家花时间阅读这篇文章.遗嘱(显然)不是我的强项.
干杯.基思.
我知道这是一个坏主意的所有原因.如果一个应用程序窃取输入焦点我不喜欢它,但这纯粹是个人使用,我希望它发生; 它不会打扰任何东西.
(对于好奇:我在NetBeans中运行单元测试,它生成一个日志文件.当我的后台应用程序看到日志文件的时间戳更改时,我希望它解析日志文件并转到前面显示结果).
这个问题没有帮助,也没有谷歌搜索.似乎BringToFront()长时间没有工作,我找不到任何替代方案.
有任何想法吗?