原文转载自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进行摄像头操作虽然涉及较多底层细节,但通过合理的封装和抽象,可以使代码保持清晰和易于维护。在实际项目中,还可以考虑使用第三方库如AForge.NET或Emgu CV,它们提供了更高级别的接口,...
在C#中,我们需要创建一个带有`extern`关键字的方法,并使用`DllImport`特性来指定API函数。例如,调用`MessageBoxA`函数: ```csharp using System; using System.Runtime.InteropServices; public class Native...
此时,开发者可以借助于C#调用Windows API函数来实现。Windows API是微软为开发者提供的一系列函数库,它包含了操作系统的核心功能,如文件操作、用户界面、系统控制等。 在C#中调用Windows API函数,主要涉及以下...
在C#编程中,有时我们需要调用Windows API来实现...总的来说,理解P/Invoke和如何正确匹配API函数签名是C#调用Windows API的关键。通过这种方式,我们可以利用.NET Framework的便利性同时访问丰富的Windows系统功能。
主要是调用Windows API user32.dll动态库,将其引入到项目之中,此为非托管代码,使用DllImport特性即可。这里也简单介绍下user32动态库,user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本...
在本文中,我们将探讨如何使用 C# 语言调用 Windows API 实现 WinForm 中嵌入 EXE 程序的技术。首先,我们需要添加对 System.Diagnostics 和 System.Runtime.InteropServices namespace 的引用,以便使用 Process 类...
综上所述,C#调用Windows API是通过P/Invoke技术实现的,涉及对DllImport特性的理解和使用,以及结构体和封送处理的掌握。这使得C#开发者能够利用.NET框架之外的丰富系统资源,扩展应用程序的功能。
总之,Visual C#调用Windows API函数是一个涉及到平台互操作的过程,需要对C#特性、数据类型映射和Windows编程有一定了解。通过`DllImport`特性、结构体布局、数据类型转换以及理解API函数的工作方式,我们可以扩展...
### C#中调用API详解 #### 一、API简介 API(Application Programming Interface),即应用程序编程接口,是在软件开发中极为重要的一个概念。对于Windows编程而言,API扮演着核心角色,尽管.NET框架下的C#提供了...
然而,在.NET框架中,布尔值是通过`bool`类型来表示的,但为了与Windows API保持一致,当调用API时,布尔值会被转换成`Int32`类型的整数,其中0代表`false`,非0代表`true`。 ### BYTE 和 CHAR `BYTE`在C#中被映射...
总的来说,C#调用API涉及到对API的理解、结构体的使用、类型转换、以及对安全和非安全代码的处理。虽然对于初学者而言可能会有些复杂,但熟悉这些基本概念和步骤后,调用API将变得更为得心应手。通过这样的方式,C#...
为了能够在C#程序中使用Windows API函数,首先需要在代码文件顶部添加以下引用: ```csharp using System.Runtime.InteropServices; ``` 这个命名空间包含了用于调用非托管代码(如Windows API)的类型和成员。 #...
C#调用Windows API的知识点涵盖从基础的概念到高级的技术实现细节。Windows API(应用程序编程接口)是一组可供Windows系统上运行的所有应用程序使用的函数、消息、数据结构和驱动程序。C#作为一种现代的、面向对象...
- **SendMessage**:向指定窗口发送消息。 ### 实现细节 1. **引入必要的命名空间**: - `System.Runtime.InteropServices`:提供对非托管代码进行互操作的类。 - `System.Threading`:提供线程处理相关的类。 ...
总的来说,C#调用Windows API是一种常用的技术,它扩展了C#的功能,让我们能够更灵活地利用操作系统资源。然而,由于API的复杂性和多样性,实际使用时需要仔细阅读API文档,了解每个函数的用途、参数和返回值,才能...
### C#调用API控制禁用键盘鼠标及锁屏功能详解 #### 一、引言 在特定的应用场景下,例如开发系统维护工具或者安全控制软件时,可能需要临时禁用用户的键盘和鼠标输入,或者锁定工作台来防止未经授权的操作。本文将...
本篇将详细介绍如何在C#中使用Windows API来实现这一目标。 首先,我们需要了解Windows API的基本概念。API是一组预定义的函数,允许程序员调用操作系统提供的服务。在C#中使用API,我们通常会定义一个包含API函数...
.netframework6.0 使用Betalgo.OpenAI.GPT3库 实现从textBox1输入问题,点击发送按钮,提出的问题和结果显示到listBox1窗口 需要注意的是需要自己注册获得openAI的密钥,以及代理地址,否则无法访问获得结果
本压缩包“调用API隐藏指定窗口.rar”显然包含的是关于如何使用API隐藏指定窗口的资料。API调用通常涉及以下关键知识点: 1. **API函数**:在Windows编程中,`ShowWindow()`是一个常用的API函数,用于控制窗口的...
例如,数据类型的映射是调用API的重要环节。C#的数据类型可能与API函数中使用的数据类型不同,因此需要进行适当的转换。例如,`BOOL`在C#中通常映射为`bool`,`int`可以映射为`Int32`,`LPARAM`和`WPARAM`通常映射为...