C#调用WinAPI及窗口过程

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函数向驱动程序发送信息,这样就完成了一次信息的交互了。

posted on 2016-03-12 17:57  行者无疆-ITer  阅读(3470)  评论(0编辑  收藏  举报

导航