C#如何选择打开的应用程序窗口

C#如何选择打开的应用程序窗口,c#,macros,C#,Macros,我正在尝试创建一个基本的宏录制/回放系统。如果我想选择一个打开的应用程序(如记事本)将其放在前面进行输入,我将如何通过名称或其他可引用的属性来调用它?您可以从使用开始-这将为您提供所有正在运行的进程的列表。检查每个进程上的不同属性-这应该可以让您继续。签出一个名为“Autohotkey”的应用程序,它可以满足您的所有需要,并为您节省大量编程时间,而且是免费的 如果autohotkey不能解决您的问题,或者您这样做是为了学习,有人问了一个“全新”的应用程序,等等,这里有一些链接可能会有所帮助:

我正在尝试创建一个基本的宏录制/回放系统。如果我想选择一个打开的应用程序(如记事本)将其放在前面进行输入,我将如何通过名称或其他可引用的属性来调用它?

您可以从使用开始-这将为您提供所有正在运行的进程的列表。检查每个进程上的不同属性-这应该可以让您继续。

签出一个名为“Autohotkey”的应用程序,它可以满足您的所有需要,并为您节省大量编程时间,而且是免费的

如果autohotkey不能解决您的问题,或者您这样做是为了学习,有人问了一个“全新”的应用程序,等等,这里有一些链接可能会有所帮助:

(上面写着“移动窗口”,但仍然有帮助)


希望能有所帮助。

以下是一个例子。基本上,先得到,然后调用它:

您应该了解以下限制:

系统限制哪些进程可以设置前台窗口。仅当以下条件之一为真时,进程才能设置前景窗口:

  • 这个过程就是前景过程
  • 该进程由前台进程启动
  • 进程接收到最后一个输入事件
  • 没有前台进程
  • 正在调试前台进程
  • 前景未锁定(请参见LockSetForegroundWindow)
  • 前台锁定超时已过期(请参阅SystemParametersInfo中的SPI_GETFOREGROUNDLOCKTIMEOUT)
  • 没有激活的菜单

我实际上已经研究过自动热键。这绝对是一个有用的应用程序,问题是,由于第三方限制和未来的预期用途(基于拾取列表的宏输入等),这必须是一个内部类型的东西。我面临的问题是,如何使该进程窗口成为活动窗口。非常感谢您提供非常详细的答案。我会立即尝试实施。这似乎有效,但我有一个特殊的问题。我在这里提出了一个新问题:
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;

namespace StackOverflow.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var proc = Process.GetProcessesByName("notepad").FirstOrDefault();
            if (proc != null && proc.MainWindowHandle != IntPtr.Zero)
                    SetForegroundWindow(proc.MainWindowHandle);
        }

        [DllImport("user32")]
        private static extern bool SetForegroundWindow(IntPtr hwnd);
    }
}