【问题标题】:How do I set the focus to the Desktop from within my C# application如何从我的 C# 应用程序中将焦点设置到桌面
【发布时间】:2012-09-22 01:31:58
【问题描述】:

Winform 应用程序。 .Net 3.5。

我需要将焦点从我的 C# 应用程序设置到用户桌面(几乎就像在桌面上模拟鼠标点击一样)。

有人可以告诉我如何用 C# 做到这一点吗?我只想将焦点设置在桌面上,以便焦点不再在我的应用程序上,但我想在我的应用程序中执行此操作。

编辑:下面的答案通过将焦点设置到桌面来工作,但它会最小化用户桌面上所有打开的窗口。

有没有办法可以将焦点设置到桌面上的下一个打开窗口?我只想将焦点从我的应用程序上移开(而不是最小化我的应用程序或隐藏它)。我只是想把注意力转移到别的地方。如果桌面可以最小化所有用户打开的窗口/应用程序,那么桌面可能不是最佳选择。

【问题讨论】:

  • 尝试最小化您的应用程序。
  • 我不想最小化我的应用程序或桌面上已经打开的任何其他应用程序。我只是想将焦点从我的应用程序转移到其他地方。

标签: c# winforms


【解决方案1】:

这应该为你做。

using System; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication1 { 
class Program { 
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
    [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true)] 
    static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam); 

    const int WM_COMMAND = 0x111; 
    const int MIN_ALL = 419; 
    const int MIN_ALL_UNDO = 416; 

    static void Main(string[] args) { 
        IntPtr lHwnd = FindWindow("Shell_TrayWnd", null); 
        SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL, IntPtr.Zero);  
        System.Threading.Thread.Sleep(2000); 
        SendMessage(lHwnd, WM_COMMAND, (IntPtr)MIN_ALL_UNDO, IntPtr.Zero); 
    } 
} 
} 

获取下一个窗口

我没有为这两个准备好的代码示例,但我会给你两个链接。您需要做的第一个想法是致电GetWindow。完成此操作后,您需要调用 SwitchToThisWindow,传入您从 GetWindow 收到的指针。

【讨论】:

  • 谢谢。这几乎可以解决问题,但它会最小化桌面上所有打开的窗口。我只想将焦点从我的应用程序上移开。有没有办法可以将它设置为桌面上的下一个可见窗口(我的应用程序窗口之后的下一个窗口)?
  • @fraXis,我编辑了我的答案。我没有为该过程准备好的代码示例,但我使用 API 参考材料对其进行了概述,因此您应该很容易构建它。
  • “SwitchToThisWindow”页面指出:“请注意,根据 MSDN,此功能已弃用,不适合一般用途。”还有什么我可以尝试的吗?
  • @fraXis,你可以试试BringWindowToTop这里pinvoke.net/default.aspx/user32/BringWindowToTop.html
  • 这帮助我解决了类似的问题,我有一个不希望获得焦点的无窗口应用程序,但它的位置有点奇怪。 FindWindow 和 BringWindowToFront 的组合做到了。干杯。
【解决方案2】:

你可以在你的项目中添加这个 COM 对象:

Microsoft Shell 控件和自动化

然后只需调用:

Shell32.ShellClass shell = new Shell32.ShellClass();
shell.MinimizeAll();

这将最小化所有窗口,然后聚焦桌面。否则,如果您的窗口非全屏,则可以使用以下方法模拟鼠标点击:

//This is a replacement for Cursor.Position in WinForms
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern bool SetCursorPos(int x, int y);

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

public const int MOUSEEVENTF_LEFTDOWN = 0x02;
public const int MOUSEEVENTF_LEFTUP = 0x04;

//This simulates a left mouse click
public static void LeftMouseClick(int xpos, int ypos)
{
    SetCursorPos(xpos, ypos);
    mouse_event(MOUSEEVENTF_LEFTDOWN, xpos, ypos, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, xpos, ypos, 0, 0);
}

您可以通过查看窗口启动位置加上高度/宽度来计算坐标,然后选择一个可用空间(确实是桌面)。

【讨论】:

  • 我不想最小化,我只想将焦点移到我自己的应用程序窗口以外的另一个窗口(不最小化我的应用程序或任何其他正在运行的应用程序)
  • @RandolfR-F,我不认为使用坐标是进入下一个窗口的最有效方式。有 API 可用于获取下一个窗口。
  • 您能告诉我如何获取下一个窗口(或执行此操作的 API 名称)吗?谢谢。
  • @RandolfR-F:鼠标单击模拟代码有效,但对用户来说有点刺耳,因为他们的鼠标指针从我的应用程序一直跳到我设置的 xpos 和 ypos在左鼠标单击中。是否有另一种方法可以在不让鼠标指针跳过用户屏幕的情况下将焦点设置在其他地方?
  • @fraXis 很抱歉,这是我能想到的唯一 hack。
猜你喜欢
  • 2017-01-18
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多