`
weizhai12
  • 浏览: 149433 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

用C#调用Windows API向指定窗口发送

 
阅读更多
原文转载自http://www.51testing.com/?uid-175761-action-viewspace-itemid-227073

一、调用Windows API。
 C#下调用Windows API方法如下:
 1、引入命名空间:using System.Runtime.InteropServices;
 2、引用需要使用的方法,格式:[DllImport("DLL文件")]方法的声明;
 [DllImport("user32.dll")]private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
 [DllImport("user32.dll")]private static extern bool SetForegroundWindow(IntPtr hWnd);
 [DllImport("user32.dll")]private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
 [DllImport("user32.dll")]private static extern int SendMessage(IntPtr hWnd,int Msg,int wParam,int lParam);
 [DllImport("user32.dll")]private static extern bool SetCursorPos(int X, int Y);
 [DllImport("user32.dll")]private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
 [DllImport("user32.dll")]private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
  [DllImport("user32.dll")]private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndlnsertAfter, int X, int Y, int cx, int cy, uint Flags);
 //ShowWindow参数
 private const int SW_SHOWNORMAL = 1;
 private const int SW_RESTORE = 9;
 private const int SW_SHOWNOACTIVATE = 4;
 //SendMessage参数
 private const int WM_KEYDOWN = 0X100;
 private const int WM_KEYUP = 0X101;
 private const int WM_SYSCHAR = 0X106;
 private const int WM_SYSKEYUP = 0X105;
 private const int WM_SYSKEYDOWN = 0X104;
 private const int WM_CHAR = 0X102;

二、找到目标窗口
1)、根据窗口的标题得到句柄
 IntPtr myIntPtr = FindWindow(null,"窗口名"); //null为类名,可以用Spy++得到,也可以为空
 ShowWindow(myIntPtr, SW_RESTORE); //将窗口还原
 SetForegroundWindow(myIntPtr); //如果没有ShowWindow,此方法不能设置最小化的窗口
2)、遍历所有窗口得到句柄
1 定义委托方法CallBack,枚举窗口API(EnumWindows),得到窗口名API(GetWindowTextW)和得到窗口类名API(GetClassNameW)
 public delegate bool CallBack(int hwnd, int lParam);
 [DllImport("user32")]public static extern int EnumWindows(CallBack x, int y);
  [DllImport("user32.dll")]private static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
 [DllImport("user32.dll")]private static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
2 调用EnumWindows遍历窗口
 CallBack myCallBack = new CallBack(Recall);
 EnumWindows(myCallBack, 0);
3 回调方法Recall
 public bool Recall(int hwnd, int lParam)
 {
  StringBuilder sb = new StringBuilder(256);
  IntPtr PW = new IntPtr(hwnd);

  GetWindowTextW(PW,sb,sb.Capacity); //得到窗口名并保存在strName中
  string strName = sb.ToString();

  GetClassNameW(PW,sb,sb.Capacity); //得到窗口类名并保存在strClass中
  string strClass = sb.ToString();

  if (strName.IndexOf("窗口名关键字") >= 0 && strClass.IndexOf("类名关键字") >= 0)
  {
   return false; //返回false中止EnumWindows遍历
  }
  else
  {
   return true; //返回true继续EnumWindows遍历
  }
 }
3)、打开窗口得到句柄
1 定义设置活动窗口API(SetActiveWindow),设置前台窗口API(SetForegroundWindow)
 [DllImport("user32.dll")]static extern IntPtr SetActiveWindow(IntPtr hWnd);
 [DllImport("user32.dll")][return: MarshalAs(UnmanagedType.Bool)]static extern bool SetForegroundWindow(IntPtr hWnd);
2 打开窗口
 Process proc = Process.Start(@"目标程序路径");
 SetActiveWindow(proc.MainWindowHandle);
 SetForegroundWindow(proc.MainWindowHandle);

三、向指定的窗口输入数据
1 利用发送消息API(SendMessage)向窗口发送数据
 InputStr(myIntPtr, _GameID); //输入游戏ID
 SendMessage(myIntPtr, WM_SYSKEYDOWN, 0X09, 0); //输入TAB(0x09)
 SendMessage(myIntPtr, WM_SYSKEYUP, 0X09, 0);
 InputStr(myIntPtr, _GamePass); //输入游戏密码
 SendMessage(myIntPtr, WM_SYSKEYDOWN, 0X0D, 0); //输入ENTER(0x0d)
 SendMessage(myIntPtr, WM_SYSKEYUP, 0X0D, 0);

 /// <summary>
 /// 发送一个字符串
 /// </summary>
 /// <param name="myIntPtr">窗口句柄</param>
 /// <param name="Input">字符串</param>
 public void InputStr(IntPtr myIntPtr, string Input)
 {
  byte[] ch = (ASCIIEncoding.ASCII.GetBytes(Input));
  for (int i = 0; i < ch.Length; i++)
  {
   SendMessage(PW, WM_CHAR, ch, 0);
  }
 }
2 利用鼠标和键盘模拟向窗口发送数据
 SetWindowPos(PW, (IntPtr)(-1), 0, 0, 0, 0, 0x0040 | 0x0001); //设置窗口位置
 SetCursorPos(476, 177); //设置鼠标位置
 mouse_event(0x0002, 0, 0, 0, 0); //模拟鼠标按下操作
 mouse_event(0x0004, 0, 0, 0, 0); //模拟鼠标放开操作
 SendKeys.Send(_GameID); //模拟键盘输入游戏ID
 SendKeys.Send("{TAB}"); //模拟键盘输入TAB
 SendKeys.Send(_GamePass); //模拟键盘输入游戏密码
 SendKeys.Send("{ENTER}"); //模拟键盘输入ENTER

另:上面还提到了keybd_event方法,用法和mouse_event方法类似,作用和SendKeys.Send一样。

分享到:
评论

相关推荐

    C#调用Windows自身的API开发摄像头拍照和摄像功能

    总之,C#调用Windows API进行摄像头操作虽然涉及较多底层细节,但通过合理的封装和抽象,可以使代码保持清晰和易于维护。在实际项目中,还可以考虑使用第三方库如AForge.NET或Emgu CV,它们提供了更高级别的接口,...

    C#中调用Windows API的要点.rar_API_C#调用C_C# windows_windows

    在C#中,我们需要创建一个带有`extern`关键字的方法,并使用`DllImport`特性来指定API函数。例如,调用`MessageBoxA`函数: ```csharp using System; using System.Runtime.InteropServices; public class Native...

    C#调用Windows API函数

    此时,开发者可以借助于C#调用Windows API函数来实现。Windows API是微软为开发者提供的一系列函数库,它包含了操作系统的核心功能,如文件操作、用户界面、系统控制等。 在C#中调用Windows API函数,主要涉及以下...

    c# 调用windows API的实例

    在C#编程中,有时我们需要调用Windows API来实现...总的来说,理解P/Invoke和如何正确匹配API函数签名是C#调用Windows API的关键。通过这种方式,我们可以利用.NET Framework的便利性同时访问丰富的Windows系统功能。

    C#Winform调用Windows API user32.dll实现鼠标事件示例-自动点击工具

    主要是调用Windows API user32.dll动态库,将其引入到项目之中,此为非托管代码,使用DllImport特性即可。这里也简单介绍下user32动态库,user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本...

    c#调用 windows api实现WinForm中嵌入EXE程序

    在本文中,我们将探讨如何使用 C# 语言调用 Windows API 实现 WinForm 中嵌入 EXE 程序的技术。首先,我们需要添加对 System.Diagnostics 和 System.Runtime.InteropServices namespace 的引用,以便使用 Process 类...

    CSharp调用WindowsAPI入门_C#_windowsapi_

    综上所述,C#调用Windows API是通过P/Invoke技术实现的,涉及对DllImport特性的理解和使用,以及结构体和封送处理的掌握。这使得C#开发者能够利用.NET框架之外的丰富系统资源,扩展应用程序的功能。

    用Visual C#调用Windows API函数

    总之,Visual C#调用Windows API函数是一个涉及到平台互操作的过程,需要对C#特性、数据类型映射和Windows编程有一定了解。通过`DllImport`特性、结构体布局、数据类型转换以及理解API函数的工作方式,我们可以扩展...

    C#中调用API,介绍API的使用

    ### C#中调用API详解 #### 一、API简介 API(Application Programming Interface),即应用程序编程接口,是在软件开发中极为重要的一个概念。对于Windows编程而言,API扮演着核心角色,尽管.NET框架下的C#提供了...

    C#中调用Windows API时的数据类型对应关系.pdf

    然而,在.NET框架中,布尔值是通过`bool`类型来表示的,但为了与Windows API保持一致,当调用API时,布尔值会被转换成`Int32`类型的整数,其中0代表`false`,非0代表`true`。 ### BYTE 和 CHAR `BYTE`在C#中被映射...

    C#中调用API C#中调用API

    总的来说,C#调用API涉及到对API的理解、结构体的使用、类型转换、以及对安全和非安全代码的处理。虽然对于初学者而言可能会有些复杂,但熟悉这些基本概念和步骤后,调用API将变得更为得心应手。通过这样的方式,C#...

    在C#中调用windows API函数

    为了能够在C#程序中使用Windows API函数,首先需要在代码文件顶部添加以下引用: ```csharp using System.Runtime.InteropServices; ``` 这个命名空间包含了用于调用非托管代码(如Windows API)的类型和成员。 #...

    C#调用windowsAPI.pdf

    C#调用Windows API的知识点涵盖从基础的概念到高级的技术实现细节。Windows API(应用程序编程接口)是一组可供Windows系统上运行的所有应用程序使用的函数、消息、数据结构和驱动程序。C#作为一种现代的、面向对象...

    用C#调用Windows API和其它进程通信

    - **SendMessage**:向指定窗口发送消息。 ### 实现细节 1. **引入必要的命名空间**: - `System.Runtime.InteropServices`:提供对非托管代码进行互操作的类。 - `System.Threading`:提供线程处理相关的类。 ...

    C#调用Windows_API

    总的来说,C#调用Windows API是一种常用的技术,它扩展了C#的功能,让我们能够更灵活地利用操作系统资源。然而,由于API的复杂性和多样性,实际使用时需要仔细阅读API文档,了解每个函数的用途、参数和返回值,才能...

    C#调用API控禁用键盘鼠标

    ### C#调用API控制禁用键盘鼠标及锁屏功能详解 #### 一、引言 在特定的应用场景下,例如开发系统维护工具或者安全控制软件时,可能需要临时禁用用户的键盘和鼠标输入,或者锁定工作台来防止未经授权的操作。本文将...

    c#,windows Api读取其他程序SysListview32内容的类

    本篇将详细介绍如何在C#中使用Windows API来实现这一目标。 首先,我们需要了解Windows API的基本概念。API是一组预定义的函数,允许程序员调用操作系统提供的服务。在C#中使用API,我们通常会定义一个包含API函数...

    C#调用openAI的APi接口实现窗口聊天功能

    .netframework6.0 使用Betalgo.OpenAI.GPT3库 实现从textBox1输入问题,点击发送按钮,提出的问题和结果显示到listBox1窗口 需要注意的是需要自己注册获得openAI的密钥,以及代理地址,否则无法访问获得结果

    调用API隐藏指定窗口.rar

    本压缩包“调用API隐藏指定窗口.rar”显然包含的是关于如何使用API隐藏指定窗口的资料。API调用通常涉及以下关键知识点: 1. **API函数**:在Windows编程中,`ShowWindow()`是一个常用的API函数,用于控制窗口的...

    Visual+C#的Windows+API调用实例

    例如,数据类型的映射是调用API的重要环节。C#的数据类型可能与API函数中使用的数据类型不同,因此需要进行适当的转换。例如,`BOOL`在C#中通常映射为`bool`,`int`可以映射为`Int32`,`LPARAM`和`WPARAM`通常映射为...

Global site tag (gtag.js) - Google Analytics