C# 如何以编程方式为windows应用程序提供输入?

C# 如何以编程方式为windows应用程序提供输入?,c#,c,automation,C#,C,Automation,这是关于这个问题: 我发现上述问题的答案非常有用。同样,我可以为windows应用程序执行此操作吗?我可以通过编程方式向Windows窗体(如.net、C#applications)应用程序的文本框中输入内容吗?我可以从程序中执行按钮单击操作吗 如果是这样的话,我可以用C程序(使用Tiny C编译器或windows平台上的任何其他编译器)来完成吗?如果没有,我可以怎样做,用哪种语言?请不要把它当作一个愚蠢的问题。任何示例代码都将非常感谢 编辑:我可以对web应用程序和网页执行同样的操作吗?您可

这是关于这个问题:

我发现上述问题的答案非常有用。同样,我可以为windows应用程序执行此操作吗?我可以通过编程方式向Windows窗体(如.net、C#applications)应用程序的文本框中输入内容吗?我可以从程序中执行按钮单击操作吗

如果是这样的话,我可以用C程序(使用Tiny C编译器或windows平台上的任何其他编译器)来完成吗?如果没有,我可以怎样做,用哪种语言?请不要把它当作一个愚蠢的问题。任何示例代码都将非常感谢

编辑:我可以对web应用程序和网页执行同样的操作吗?

您可以对系统进行编辑。
你可以到任何窗口

例如,要设置文本框的文本,您必须发送消息

仅供参考:这是一个非常有趣的工具,它也大量使用它(也用于调试或首先检查您试图以编程方式访问的窗口)

您可能还对以下方面感兴趣:

AutoIt v3是一种类似于基本免费软件的脚本语言,旨在实现Windows GUI和通用脚本的自动化。它结合使用模拟按键、鼠标移动和窗口/控件操作,以其他语言(如VBScript和SendKeys)无法实现或不可靠的方式自动化任务。AutoIt也是非常小的、独立的,可以在所有版本的开箱即用Windows上运行,无需烦人的“运行时”

您可以选择系统的一部分。
你可以到任何窗口

例如,要设置文本框的文本,您必须发送消息

仅供参考:这是一个非常有趣的工具,它也大量使用它(也用于调试或首先检查您试图以编程方式访问的窗口)

您可能还对以下方面感兴趣:

AutoIt v3是一种类似于基本免费软件的脚本语言,旨在实现Windows GUI和通用脚本的自动化。它结合使用模拟按键、鼠标移动和窗口/控件操作,以其他语言(如VBScript和SendKeys)无法实现或不可靠的方式自动化任务。AutoIt也是非常小的、独立的,可以在所有版本的开箱即用Windows上运行,无需烦人的“运行时”


正如弗雷杰所指出的,你当然可以做到

对于windows应用程序来说,这更具挑战性。因为单个控件也算作窗口,所以总窗口数将比您预期的要高得多;要找到要向其发送输入的特定控件需要很多工作

但一旦你知道哪个窗口是你的目标,你可以通过编程方式移动、调整大小、检查、填充、最大化或以其他方式影响应用程序的窗口

几年前,我编写了执行发现过程的代码。它找到了目标应用程序的所有窗口,然后使用它们的大小和位置数据,生成了每个子窗口的半透明覆盖,以及句柄编号。因此,我可以直观地分辨出哪个控件与哪个句柄一起使用

编辑:添加了一些代码。这是一些基本的C#互操作代码,可以让您轻松地调用user32.dll,它保存着fretje提到的FN。这只是给了你发现和操纵的基本要求;你仍然需要做艰苦的工作,列举和检查你发现的东西。如果你能找到一个第三方软件包为你做这项工作,省去你自己的麻烦;我这样做只是为了学习,而且相当辛苦

using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Text;

namespace WinAPI
{
    [Flags] public enum WindowStyleFlags : uint
    {
        WS_OVERLAPPED      = 0x00000000,
        WS_POPUP           = 0x80000000,
        // more...
    }

    [Flags] public enum ExtendedWindowStyleFlags: int
    {
        WS_EX_DLGMODALFRAME    = 0x00000001,
        WS_EX_NOPARENTNOTIFY   = 0x00000004,
        // more...
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct POINT
    {
        public int Left;
        public int Top;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct FLASHWINFO
    {
        public int cbSize;
        public IntPtr hwnd;
        public int dwFlags;
        public int uCount;
        public int dwTimeout;
    }

    public delegate int EnumWindowsCallback( IntPtr hwnd, int lParam );

    public class User32Dll
    {
        // Constants & fields
        public const int FLASHW_STOP = 0;
        public const int FLASHW_CAPTION = 0x00000001;
        // lots, lots more, web search for them...

        // Self-added, don't know if correct
        [DllImport("user32")]
        public extern static bool CloseWindow( IntPtr hWnd );
        [DllImport("user32")]
        public extern static IntPtr GetDesktopWindow();
        [DllImport("user32")]
        public extern static IntPtr GetForegroundWindow();
        [DllImport("user32")]
        public extern static int GetDlgItem( IntPtr hWnd, int wMsg );
        [DllImport("user32")]
        public extern static int GetListBoxInfo( IntPtr hWnd );
        [DllImport("user32")]
        public extern static bool MoveWindow( IntPtr hWnd, int X, int Y, int Width, int Height, bool Repaint );
        [DllImport( "user32" )]
        public static extern int SendMessage( IntPtr hWnd, int uMsg, IntPtr wParam, StringBuilder lpString );
        [DllImport("user32")]
        public static extern bool SetWindowPos( IntPtr hWnd, IntPtr afterWnd, int X, int Y, int cX, int cY, uint uFlags );

        [DllImport("user32")]
        public extern static int BringWindowToTop (IntPtr hWnd);
        [DllImport("user32")]
        public extern static int EnumWindows( EnumWindowsCallback lpEnumFunc, int lParam );
        [DllImport("user32")]
        public extern static int EnumChildWindows( IntPtr hWndParent, EnumWindowsCallback lpEnumFunc, int lParam );
        [DllImport( "user32.dll" )]
        public static extern int EnumThreadWindows( IntPtr hWndParent, EnumWindowsCallback callback, int lParam );
        [DllImport( "user32.dll" )]
        public static extern int FindWindow( string lpClassName, string WindowName );
        [DllImport( "user32.dll" )]
        public static extern int FindWindowEx( IntPtr hWnd, IntPtr hWnd2, string lpsz, string lpsz2 );
        [DllImport("user32")]
        public extern static int FlashWindow ( IntPtr hWnd, ref FLASHWINFO pwfi);
        [DllImport("user32")]
        public extern static IntPtr GetAncestor( IntPtr hWnd, uint gaFlags );
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int GetClassName ( IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static uint GetWindowLong( IntPtr hwnd, int nIndex);
        [DllImport("user32")]
        public extern static int GetClientRect( IntPtr hWnd, ref RECT lpRect);
        [DllImport("user32")]
        public extern static int GetWindowRect( IntPtr hWnd, ref RECT lpRect);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int GetWindowText( IntPtr hWnd, StringBuilder lpString, int cch );
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int GetWindowTextLength( IntPtr hWnd );
        [DllImport("user32")]
        public extern static int IsIconic(IntPtr hWnd);
        [DllImport("user32")]
        public extern static int IsWindowVisible( IntPtr hWnd );
        [DllImport("user32")]
        public extern static int IsZoomed(IntPtr hwnd);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int PostMessage( IntPtr hWnd, int wMsg, int wParam, int lParam);
        [DllImport( "user32.dll" )]
        public static extern int RealGetWindowClass( IntPtr hWnd, StringBuilder pszType, uint bufferSize );
        [DllImport("user32")]
        public extern static int ScreenToClient( IntPtr hWnd, ref POINT lpPoint);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int SendMessage( IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll")]
        public extern static int SetForegroundWindow (IntPtr hWnd);
        [DllImport( "user32.dll" )]
        public static extern int SetWindowText( IntPtr hWnd, string lpsz );
    }
}

正如弗雷杰所指出的,你当然可以做到

对于windows应用程序来说,这更具挑战性。因为单个控件也算作窗口,所以总窗口数将比您预期的要高得多;要找到要向其发送输入的特定控件需要很多工作

但一旦你知道哪个窗口是你的目标,你可以通过编程方式移动、调整大小、检查、填充、最大化或以其他方式影响应用程序的窗口

几年前,我编写了执行发现过程的代码。它找到了目标应用程序的所有窗口,然后使用它们的大小和位置数据,生成了每个子窗口的半透明覆盖,以及句柄编号。因此,我可以直观地分辨出哪个控件与哪个句柄一起使用

编辑:添加了一些代码。这是一些基本的C#互操作代码,可以让您轻松地调用user32.dll,它保存着fretje提到的FN。这只是给了你发现和操纵的基本要求;你仍然需要做艰苦的工作,列举和检查你发现的东西。如果你能找到一个第三方软件包为你做这项工作,省去你自己的麻烦;我这样做只是为了学习,而且相当辛苦

using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Text;

namespace WinAPI
{
    [Flags] public enum WindowStyleFlags : uint
    {
        WS_OVERLAPPED      = 0x00000000,
        WS_POPUP           = 0x80000000,
        // more...
    }

    [Flags] public enum ExtendedWindowStyleFlags: int
    {
        WS_EX_DLGMODALFRAME    = 0x00000001,
        WS_EX_NOPARENTNOTIFY   = 0x00000004,
        // more...
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct POINT
    {
        public int Left;
        public int Top;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct FLASHWINFO
    {
        public int cbSize;
        public IntPtr hwnd;
        public int dwFlags;
        public int uCount;
        public int dwTimeout;
    }

    public delegate int EnumWindowsCallback( IntPtr hwnd, int lParam );

    public class User32Dll
    {
        // Constants & fields
        public const int FLASHW_STOP = 0;
        public const int FLASHW_CAPTION = 0x00000001;
        // lots, lots more, web search for them...

        // Self-added, don't know if correct
        [DllImport("user32")]
        public extern static bool CloseWindow( IntPtr hWnd );
        [DllImport("user32")]
        public extern static IntPtr GetDesktopWindow();
        [DllImport("user32")]
        public extern static IntPtr GetForegroundWindow();
        [DllImport("user32")]
        public extern static int GetDlgItem( IntPtr hWnd, int wMsg );
        [DllImport("user32")]
        public extern static int GetListBoxInfo( IntPtr hWnd );
        [DllImport("user32")]
        public extern static bool MoveWindow( IntPtr hWnd, int X, int Y, int Width, int Height, bool Repaint );
        [DllImport( "user32" )]
        public static extern int SendMessage( IntPtr hWnd, int uMsg, IntPtr wParam, StringBuilder lpString );
        [DllImport("user32")]
        public static extern bool SetWindowPos( IntPtr hWnd, IntPtr afterWnd, int X, int Y, int cX, int cY, uint uFlags );

        [DllImport("user32")]
        public extern static int BringWindowToTop (IntPtr hWnd);
        [DllImport("user32")]
        public extern static int EnumWindows( EnumWindowsCallback lpEnumFunc, int lParam );
        [DllImport("user32")]
        public extern static int EnumChildWindows( IntPtr hWndParent, EnumWindowsCallback lpEnumFunc, int lParam );
        [DllImport( "user32.dll" )]
        public static extern int EnumThreadWindows( IntPtr hWndParent, EnumWindowsCallback callback, int lParam );
        [DllImport( "user32.dll" )]
        public static extern int FindWindow( string lpClassName, string WindowName );
        [DllImport( "user32.dll" )]
        public static extern int FindWindowEx( IntPtr hWnd, IntPtr hWnd2, string lpsz, string lpsz2 );
        [DllImport("user32")]
        public extern static int FlashWindow ( IntPtr hWnd, ref FLASHWINFO pwfi);
        [DllImport("user32")]
        public extern static IntPtr GetAncestor( IntPtr hWnd, uint gaFlags );
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int GetClassName ( IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static uint GetWindowLong( IntPtr hwnd, int nIndex);
        [DllImport("user32")]
        public extern static int GetClientRect( IntPtr hWnd, ref RECT lpRect);
        [DllImport("user32")]
        public extern static int GetWindowRect( IntPtr hWnd, ref RECT lpRect);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int GetWindowText( IntPtr hWnd, StringBuilder lpString, int cch );
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int GetWindowTextLength( IntPtr hWnd );
        [DllImport("user32")]
        public extern static int IsIconic(IntPtr hWnd);
        [DllImport("user32")]
        public extern static int IsWindowVisible( IntPtr hWnd );
        [DllImport("user32")]
        public extern static int IsZoomed(IntPtr hwnd);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int PostMessage( IntPtr hWnd, int wMsg, int wParam, int lParam);
        [DllImport( "user32.dll" )]
        public static extern int RealGetWindowClass( IntPtr hWnd, StringBuilder pszType, uint bufferSize );
        [DllImport("user32")]
        public extern static int ScreenToClient( IntPtr hWnd, ref POINT lpPoint);
        [DllImport("user32", CharSet = CharSet.Auto)]
        public extern static int SendMessage( IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll")]
        public extern static int SetForegroundWindow (IntPtr hWnd);
        [DllImport( "user32.dll" )]
        public static extern int SetWindowText( IntPtr hWnd, string lpsz );
    }
}

如果您的应用程序主要只需要操作其他窗口,通过发送击键等,我会使用。它的主要功能正是这项工作,它做得很好


所以也许你应该试试,因为不是每个问题都是钉子,可以用锤子解决(C#)-)

如果您的应用程序主要只需要操作其他窗口,请发送击键等。我会使用。它的主要功能正是这项工作,它做得很好


所以也许你应该试试,因为不是每个问题都是钉子,可以用锤子解决(C#)-)

检查以下问题。有许多供应商和开源工具可以为您完成这项工作,因此您不必编写Win32 API的代码


检查以下SO问题。有许多供应商和开源工具可以为您完成这项工作,因此您不必编写Win32 API的代码


应用程序会受到这样的干扰,这不是很疯狂吗?Windows中是否有任何类型的进程级保护,或者每个进程都可以看到每个进程?我不知道没有。。。这就是启示()在密码字段中显示密码的方式。。。中高音