C#调用API向外部程序发送数据

C#调用API向外部程序发送数据

         最近有可能要做一个项目。在项目中有这么一个功能,在A程序中调用B程序,同时在A程序中进行登陆后,要将A程序的登录名和密码自动填充到B程序的登陆对话框中,这样B程序就不需要再输入一次用户名和密码了,简化操作人员的操作。刚好最近闲着没事,就在怎么想怎么去实现。经过两天的折腾,基本上完成了上述功能的实现。下面就把实现方法、过程与大家进行分享。

一、原理

要实现上述功能,需要调用Win API来实现。Win32 API即为Microsoft 32位平台的应用程序编程接口Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。

那么在本程序的实现过程中,需要用到以下三个API函数(函数说明均从网上找的,方便大家查看),以及自己编写的一个FindWindowByIndex函数。

1、static extern int SendMessage1(IntPtrhwnd, uint wMsg, intwParam, int lParam);

顾名思义,SendMessage函数的功能是“发送消息”,即将一条消息发送到指定对象(操作系统、窗口或控件等)上,以产生特定的动作(如滚屏、修改对象外观等)。

其中四个自变量的含义和说明如下:

    hWnd:对象的句柄。希望将消息传送给哪个对象,就把该对象的句柄作为实参传送。

wMsg:被发送的消息。根据具体需求和不同的对象,将不同的消息作为实参传送,以产生预期的动作。

wParam、lParam:附加的消息信息。这两个是可选的参数,用来提供关于wMsg消息更多的信息,不同的wMsg可能使用这两个参数中的0、1或2个,如果不需要哪个附加参数,则将实参赋为NULL(在VB中赋为0)。

2、public static extern IntPtrFindWindow(string className, string windowName);

FindWindow函数返回与指定字符创相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。这个函数不会查找子窗口。

lpClassName:指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。

lpWindowName:指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。

返回值:如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。

3static extern IntPtr FindWindowEx(IntPtrhwndParent, IntPtr hwndChildAfter, string lpszClass, stringlpszWindow);

在窗口列表中寻找与指定条件相符的第一个子窗口。该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。

hwndParent:要查找的子窗口所在的父窗口句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。如果hwndParent 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。Windows NT5.0 and later:如果hwndParentHWND_MESSAGE,函数仅查找所有消息窗口。

hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfterNULL,查找从hwndParent的第一个子窗口开始。如果hwndParent

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
取消外部程序的鼠标监听事件需要使用 Windows API 来实现。具体步骤如下: 1. 首先,需要获取目标程序的进程句柄,可以使用 Process 类来获取。 2. 使用 Windows API 函数 SetWindowsHookEx 来安装一个鼠标钩子,并获取该钩子的句柄。 3. 使用 Windows API 函数 UnhookWindowsHookEx 来卸载该钩子,从而取消鼠标监听事件。 下面是 C# 代码示例: ``` using System; using System.Diagnostics; using System.Runtime.InteropServices; public class MouseHook { private const int WH_MOUSE_LL = 14; private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr hookID = IntPtr.Zero; [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); private static IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { return IntPtr.Zero; } public static void UninstallHook(Process targetProcess) { if (hookID != IntPtr.Zero) { UnhookWindowsHookEx(hookID); hookID = IntPtr.Zero; } } public static void InstallHook(Process targetProcess) { hookID = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); } } ``` 在上述代码示例中,InstallHook 方法用于安装鼠标钩子,UninstallHook 方法用于卸载鼠标钩子。调用 InstallHook 方法后,该钩子会监听所有的鼠标事件,直到调用 UninstallHook 方法将其卸载。在实际使用时,可以在需要取消鼠标监听事件的地方调用 UninstallHook 方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值