Tag: 焦点

SetForegroundWindow仅在visual studio打开时工作

我正在尝试用c#设置一个进程窗口到前台/焦点(从那个时候没有焦点的应用程序),因此我使用user32.dll static extern bool SetForegroundWindow(IntPtr hWnd)方法: [DllImport(“user32.dll”)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); public void setFocus() { SetForegroundWindow(process.MainWindowHandle); } 一切都工作得很好,但只有当我打开Visual Studio 2008时,我甚至不需要从VS08启动应用程序,它足以让项目打开它。 当我关闭项目时,我的应用程序无法将另一个窗口设置为前景。 唯一的结果是,在任务栏中,另一个窗口突出显示为蓝色。 我将再次使用VS08打开我的项目它的工作正常。 我没有丝毫想法为什么……我的问题可能是他不能导入dll但是它不会高亮,而其他win32函数就像static extern bool ShowWindow(IntPtr hWnd, IntPtr status); 即使项目结束也在工作。 针对这个问题的任何解决方案或提示? 编辑: 我读了这个函数的评论,我知道我的应用程序没有焦点,所以我尝试了这个: [DllImport(“user32.dll”)] static extern bool SetForegroundWindow(IntPtr hWnd); [return: MarshalAs(UnmanagedType.Bool)] [DllImport(“user32.dll”)] static extern bool AllowSetForegroundWindow(int procID); [DllImport(“user32.dll”)] private static extern […]

WPF TabControl在SelectionChanged上,将焦点设置为文本字段

我有一个标签控件和一些标签项。 我正在成功收听SelectionChanged事件,并检查我感兴趣的选项卡是否是当前选中的选项卡。 我正在使用这个代码(下面),并通过调试器,我可以看到我的分支逻辑按设计工作; 但是,我遇到的问题是有些东西覆盖了对txt.Focus()调用,因为在显示正确的选项卡项后,焦点不在文本框上。 private void tabMain_SelectionChanged(object sender, SelectionChangedEventArgs e) { // exact same behavior with and without this line e.Handled = true; if (e.AddedItems.Contains(usrTab)) { txtusr.Focus(); } else if (e.AddedItems.Contains(svcTab)) { txtsvc.Focus(); } } 如果我只是将txtusr.Focus()放在按钮事件处理程序中,它就会完全按照我的预期进行聚焦。 我怀疑这与调用.Focus()方法时没有加载的tabitem内容有关,但我不确定如何修复它。

Winforms c# – 将焦点设置为TabPage的第一个子控件

假设我有一个嵌套在TabControl的Textbox 。 当表单加载时,我想关注该Textbox (默认情况下焦点设置为TabControl )。 只需在表单的Load事件中调用textbox1.focus()似乎不起作用。 我已经能够通过执行以下操作来关注它: private void frmMainLoad(object sender, EventArgs e) { foreach (TabPage tab in this.tabControl1.TabPages) { this.tabControl1.SelectedTab = tab; } } 我的问题是: 有没有更优雅的方式来做到这一点?

知道谁在迷失焦点事件中获得了焦点

是否有可能知道谁在焦点事件中失去了焦点? Compact Framework没有ActiveControl ,所以我不知道如何判断谁得到了关注。

在C#中打开一个没有焦点的表单

我正在制作一些永远在顶的祝酒作为forms,当我打开它们时,我希望它们在打开时不要把焦点从其他forms上拿走。 我怎样才能做到这一点? 谢谢

WPF命令路由行为的不一致性取决于UI焦点状态

我有一个RoutedUICommand命令,可以通过两种不同的方式触发: 直接通过ICommand.Execute点击按钮事件; 使用声明性语法: 。 该命令仅由顶部窗口处理: 第一种方法仅在窗口中存在聚焦元素时才有效。 无论焦点如何,第二个总是这样。 我查看了BCL的ICommand.Execute实现,发现如果Keyboard.FocusedElement为null ,命令不会被触发,所以这是设计的。 我仍然质疑,因为顶层可能有一个处理程序(就像在我的情况下)仍然希望接收命令,即使应用程序没有UI焦点(例如,我可能想调用ICommand.Execute当收到套接字消息时,从异步任务中执行)。 让它成为现实,我仍然不清楚为什么第二种(声明性)方法总是有效,无论焦点状态如何。 我对WPF命令路由的理解中缺少什么? 我敢肯定这不是一个错误,而是一个function。 以下是代码。 如果你喜欢玩它,这是完整的项目 。 单击第一个按钮 – 命令将被执行,因为焦点位于TextBox内部。 点击第二个按钮 – 一切都很好。 单击“ Clear Focus按钮。 现在第一个按钮( ICommand.Execute )不执行命令,而第二个按钮仍然执行。 您需要单击TextBox以使第一个按钮再次工作,因此有一个聚焦元素。 这是一个人为的例子,但它具有现实生活中的意义。 我将发布一个关于使用WindowsFormsHost托管WinForms控件的相关问题( 此处询问 [EDITED] ),在这种情况下,当焦点位于WindowsFormsHost内时, Keyboard.FocusedElement始终为null (通过ICommand.Execute有效地终止命令执行)。 XAML代码: C#代码 ,大部分与焦点状态记录有关: using System; using System.Windows; using System.Windows.Input; namespace WpfCommandTest { public partial class MainWindow : Window { […]

如何聚焦外窗?

我有一个应用程序,一次只能打开一个自己的实例。 为了强制执行此操作,我使用以下代码: 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. //… 它工作正常。 我还希望它能够集中已经运行的副本的forms。 也就是说,在返回之前,我想将此应用程序的其他实例置于前台。 我怎么做? Re:SetForeGroundWindow: SetForeGroundWindow工作到一定程度: [System.Runtime.InteropServices.DllImport(“user32.dll”)] public static extern bool SetForegroundWindow(IntPtr hWnd); //… if (p.Id != […]

在没有聚焦的情况下打开隐藏的Internet Explorer窗口?

我想打开一个隐藏的Internet Explorer窗口而不会窃取焦点。 我有一个Timer对象,每5分钟打开一次Internet Explorer,检查网站是否有更新。 问题是每次检查更新时,都会从前台的当前应用程序中窃取焦点。 以下是我开始这个过程的方法: Process m_Proc = new Process(); m_Proc.StartInfo.Arguments = String.Format(“{0}{1}”, “-nomerge “, browserURL); m_Proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; m_Proc.StartInfo.UseShellExecute = true; m_Proc.StartInfo.CreateNoWindow = true; m_Proc.StartInfo.FileName = String.Format(“iexplore.exe”); m_Proc.Start(); 它总是窃取焦点,即使它被隐藏。 我希望它从没有发生任何事情开始,因此用户可以继续处理他们正在做的事情。 谢谢。

如何强制执行我的应用程序的单个实例?

如何确保我的应用程序的单个实例,并在尝试打开第二个实例时将焦点设置为它? 我试过了: public partial class Form1 : Form { [DllImport(“USER32.DLL”, CharSet = CharSet.Unicode)] public static extern IntPtr FindWindow(String lpClassName, String lpWindowName); [DllImport(“USER32.DLL”)] public static extern Boolean SetForegroundWindow(IntPtr hWnd); private void Form1_Load(object sender, EventArgs e) { bool isRunning = Process.GetProcesses() .Where(p => p.MainWindowTitle.Contains(Text)) .Count() > 1; if (isRunning) { FocusWindow(Text); Application.Exit(); } } public static void […]

通知窗口 – 防止窗口获得焦点

我在收到通知框以在c#中正常运行时遇到一些问题。 基本上我在屏幕的右下方显示一个无边框forms,它显示一条消息几秒钟然后消失。 问题是我需要它出现在其他窗口的顶部,而不能偷取焦点。 理想情况下,我希望它是纯粹的托管代码,虽然通过类似的例子我怀疑这是可能的。 目前我在使用覆盖调用Form.Show()时阻止它窃取焦点: protected override bool ShowWithoutActivation // stops the window from stealing focus { get { return true; } } 然后忽略鼠标点击: private const int WM_MOUSEACTIVATE = 0x0021; private const int MA_NOACTIVATEANDEAT = 0x0004; protected override void WndProc(ref Message m) { if (m.Msg == WM_MOUSEACTIVATE) { m.Result = (IntPtr)MA_NOACTIVATEANDEAT; return; } base.WndProc(ref m); […]