C#调用WINAPI及Windows窗口消息的发与送

最近在做一个餐饮项目(C#Winform),其中有一块是做点菜宝接口的对接,点菜宝的厂商提供了一个WX.exe的驱动程序,这个驱动程序无直接打开,只能通过自己的编写的接口程序调用和关闭,当时提供的例子一个VB和Delphi的用例,可是这块项目组的人都没有接触过,后来通过厂商了解到接口程序的开发原理是基于文本+消息机制的。 文本是说要用到文本文件的读和写, 消息是说要用到 Windows 窗口消息的发与收。

了解到这些后,我们就要去调用WinAPI用来接收驱动消息和向驱动程序发送消息,话不多说,直接上代码说明


  • 1引入需要使用的方法
  •   [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);// [DllImport("user32", CharSet = CharSet.Ansi, EntryPoint = "FindWindowA", ExactSpelling = false, SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  • 2利用窗口过程监控消息的接收并发送消息

消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。

例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。

消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。

例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,

它在Windows单元中是这样声明的:

HWND  hwnd;      //目标窗口句柄
UINT message; //消息常量标识符
WPARAM wParam; // 32位消息的特定附加信息
LPARAM lParam; // 32位消息的特定附加信息
DWORD time; //消息创建时的时间
TPoint pt; //消息创建时的鼠标位置

hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。

message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。

wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。

lParam 通常是一个指向内存中数据的指针。上示例的代码:

   protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == 0x500)
{
if (toHandler == (IntPtr)0)
{
toHandler = m.LParam;//获得WX句柄(这是驱动程序的句柄)
}
else
{
int MessageTag=m.LParam.ToInt32();
if (MessageTag >= 1 && MessageTag <= 8)//处理1-8基站的请求,并回复
{
ProcessBaseStaion(MessageTag);
//发回响应通知WX.exe
SendMessage(toHandler, (uint)0x500, new IntPtr(0), new IntPtr(MessageTag));
}
else if (MessageTag == 10)////有登陆请求程序验证密码的正确性,内容在DL.TXT,请回复到DL.TXT。
{
FileUtil.WriteContent(@".\TXT\DL.TXT", "1");
//发回响应通知WX.exe
SendMessage(toHandler, (uint)0x500, new IntPtr(0), new IntPtr(10)); } }
}
base.WndProc(ref m);
}

上面的代码就是我在项目中写的一段代码,驱动程序向我的窗体发消息时m.Msg(消息常量标识符)的数值是固定的值0x500,并且在发送的消息的附件信息中包含着驱动程序的句柄,so我就可以通过m.Msg甄别驱动发过来的消息,并且通过 SendMessage函数向驱动程序发送信息,这样就完成了一次信息的交互了。

C#调用WinAPI及窗口过程的更多相关文章

  1. 从普通函数到对象方法 ------Windows窗口过程的面向对象封装

    原文地址:http://blog.csdn.net/linzhengqun/article/details/1451088 从普通函数到对象方法 ------Windows窗口过程的面向对象封装 开始 ...

  2. win32编程中消息循环和WndProc()窗口过程函数

    原文地址:https://blog.csdn.net/zxxSsdsd/article/details/45504383 在win32程序的消息循环函数中  while (GetMessage (&a ...

  3. windows窗口过程函数名词解析

    windows窗口过程函数名词解析 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 1. LR ...

  4. 深入解析Windows窗口创建和消息分发(三个核心问题:怎么将不同的窗口过程勾到一起,将不同的hwnd消息分发给对应的CWnd类去处理,CWnd如何简单有效的去处理消息,由浅入深,非常清楚) good

    笔记:争取不用看下面的内容,只看自己的笔记,就能记住这个流程,就算明白了: _tWinMain-->AfxWinMain,它调用四个函数: -->AfxWinInit用于做一些框架的初始化 ...

  5. ATL中窗口句柄与窗口过程的关联方法

    ATL中采用了一种动态生成机器指令的方式进行窗口句柄与窗口对象进行关联,以是详细分析: CWindowImpl会在第一次调用Create时注册窗口类,该窗口类是的信息是在CWindowImpl的子类中 ...

  6. 【阿炬Android笔记】01、调用VitamioBundle播放窗口

    1.调用VitamioBundle播放窗口 Intent intent = new Intent(getApplicationContext(), VideoActivity.class); inte ...

  7. MSG结构体和WndProc窗口过程详解

    MSG结构体和WndProc窗口过程对于Windows编程非常重要,如果不了解它们,可以说就没有学会Windows编程. MSG结构体 MSG 结构体用来表示一条消息,各个字段的含义如下: typed ...

  8. win32程序通过LPCREATESTRUCT中的lpCreateParams传递参数给窗口过程函数

    win32窗口程序中如果需要给窗口过程函数传递自定义参数,可以通过LPCREATESTRUCT结构体中的lpCreateParams进行传递. 创建窗口实例函数: m_hWnd = CreateWin ...

  9. 父窗口调用iframe子窗口方法

    一.父窗口调用iframe子窗口方法 1.HTML语法:<iframe name="myFrame" src="child.html"></i ...

随机推荐

  1. Cucumber 入门一

    (转自:http://www.cnblogs.com/jarodzz/archive/2012/07/02/2573014.html) 第一次看到Cucumber和BDD(Behavior Drive ...

  2. 取消掉Transfer-Encoding:chunked

    先说解决方法:::不让服务器返回Transfer-Encoding:chunked,在客户端请求的时候可以使用http 1.0的协议. 有时候,Web服务器生成HTTP Response是无法在Hea ...

  3. javaio学习笔记-字符流类(1)

    1.java.io包中的字符流类-BufferedReader和BufferedWriter: BufferedReader:缓存的输入字符流; BufferedWriter:缓存的输出字符流; In ...

  4. 一个公网地址部署LVS/DR模式

    http://blog.chinaunix.net/uid-7411781-id-3436142.html 一个公网地址部署LVS/DR模式   网上看了很多关于LVS的文章,在选取2种模式LVS/D ...

  5. PowerDesigner自定义列和过滤器

    好多次要增加注释列,默认值列都忘了怎么设置,写下来以备后用:) 选中表,然后右键,选择properties->columns->点击下图中那个不显眼的小图标(Customize Colum ...

  6. Logistic回归总结

    原文:http://blog.csdn.net/dongtingzhizi/article/details/15962797  Logistic回归总结 作者:洞庭之子 微博:洞庭之子-Bing (2 ...

  7. struts2简单示例

    今天写一个struts2的例子,目的是为了让大家明白struts2的基本流程,其实框架没有大家想象的那么难,说白了struts2的本质就是一个大的Servlet,即原本需要提交到Servlet处理的部 ...

  8. css笔记16:盒子模型的入门案例

    1.案例一: 效果图如下: (1)box1.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...

  9. XML&nbsp; XmlDocument

    1.SelectSingleNode(xPath)  xPxth:xml/cam/type  一层一层递进

  10. Oracle 版本查看及版本号说明

    http://blog.163.com/magicc_love/blog/static/185853662201210194592757/ select * from v$version; 或sele ...