C# 如何以编程方式为windows应用程序提供输入?
这是关于这个问题: 我发现上述问题的答案非常有用。同样,我可以为windows应用程序执行此操作吗?我可以通过编程方式向Windows窗体(如.net、C#applications)应用程序的文本框中输入内容吗?我可以从程序中执行按钮单击操作吗 如果是这样的话,我可以用C程序(使用Tiny C编译器或windows平台上的任何其他编译器)来完成吗?如果没有,我可以怎样做,用哪种语言?请不要把它当作一个愚蠢的问题。任何示例代码都将非常感谢 编辑:我可以对web应用程序和网页执行同样的操作吗?您可以对系统进行编辑。C# 如何以编程方式为windows应用程序提供输入?,c#,c,automation,C#,C,Automation,这是关于这个问题: 我发现上述问题的答案非常有用。同样,我可以为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中是否有任何类型的进程级保护,或者每个进程都可以看到每个进程?我不知道没有。。。这就是启示()在密码字段中显示密码的方式。。。中高音