用C# 调用API
    如果在API中有一个自定义事件;
    
//////////////////////////////////////////////////////////
// MsgName: TI_TELOFFHOOK_MESSAGE
//
// Function: 本地话机摘机
//
// wParam: 保留
//
// lParam: 保留
//////////////////////////////////////////////////////////
#define TI_TELOFFHOOK_MESSAGE (WM_USER+712)当本地话机摘机时,这个事件触发
我在C# 中如何使用如果是方法我们可以用//控制系统摘机
[DllImport("TmA4Drv.dll")]
private static extern void  OffHook(); 来调用。还请指教!不胜感激!

解决方案 »

  1.   

    委托
    public delegate vod OnOffHook();
      

  2.   

    我写一个代理
    那么怎么和API中的
    #define TI_TELOFFHOOK_MESSAGE (WM_USER+712)
    关联起来呢?
        还望指教!
      

  3.   

    大致把dll的代码贴出来,事件一般是客户端定义,由服务端触发,
    #define .....
    可以用
    public const int TI_TELOFFHOOK_MESSAGE 812 //我记不大清了,WM_USER好像是100
      

  4.   

    我没有dll 的代码
    只有二次开发文档
    就是上面贴得还请个位大侠指教.
    急!谢谢!
      

  5.   

    sorry不是要dll的代码 ,要dll的函数声明
      

  6.   

    消息在windows系统中只是一个long型数字而已.WM_USER数字多少我忘了,你加上712,就是TI_TELOFFHOOK_MESSAGEWM_USER具体是多少请查阅WinDef.h
      

  7.   

    不好意思!
    这些我都不太懂!如果知道了UM_USER是多少后怎么做呢?怎么在C# 中使用是我最想知道的问题。谢谢!
      

  8.   

    ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconcallbacksample.htm
      

  9.   

    各位大哥!
    问题还是没有解决啊!To: hdt(倦怠) 
    ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconcallbacksample.htm怎么用啊?
    定义了代理,但是什么时候触发,
    触发的代码在哪添加啊?
      

  10.   

    怎么用啊?
    定义了代理,但是什么时候触发,
    触发的代码在哪添加啊?
    ===============
    触发是由dll里代码来进行的
      

  11.   

    抱歉我还是搞不太懂!我写了一个类
    如:
    ///定义一个代理
    public delegate bool TELOFFHOOK(int value);
    myClass
    {public myClass()
    {
    HookUp(new TELOFFHOOK(Bridge.HookUp),817);
    }//控制摘机
    [DllImport("*.dll")]
    private static extern void  HookUp(int value); 
    }上面可能写得有点问题,
    我先接着说吧!我在另一个类中引用myClass (如果要出发应该myClass中要有一个事件才行,这个事件写在哪?怎么写?)谢谢!
      

  12.   

    OffHook(); 
    这个函数的作用是什么?
      

  13.   

    C#中也可以截获消息的,你截获TI_TELOFFHOOK_MESSAGE (WM_USER+712),然后处理
      

  14.   

    我是否可以这样理解你的意思:
    硬件会触发一个事件,发送消息TI_TELOFFHOOK_MESSAGE (WM_USER+712),你需要在C#中处理这个消息,如果是这样,你可以如下试试:
    你的类需要实现IMessageFilter接口,只有一个方法:
             public bool PreFilterMessage(ref Message m)
    {
    // TODO:  添加 FlashForm.PreFilterMessage 实现
    if (m.Msg==(WM_USER+712)) //截获消息
    {
      //处理此消息 }
    else
    {
    DisPatchMessage(m);
    }


    return false;
    }
    别忘了构造函数中加上Application.AddMessageFilter(this);
    这样一来,就可以处理任何你想要的消息,不知道我理解的对不对。
      

  15.   

    WM_USER+712  \\WM_USER=0x0400;这是一个Windows消息,你应该用一个窗体接收这个消息,再处理。
      

  16.   

    多谢各位大侠。
    获取消息没问题了。
    但我又遇到新的问题了。
    [DllImport("*.dll")]
    TV_GetEvent(TV_Event *event);其中 TV_Event 是一个结构体
    public struct TV_Event
    {
    public long Type; 
    public object data;
    }参数是地址我用
    TV_GetEvent(ref TV_Event event);然后调用TV_Event event = new TV_Event();
    TV_GetEvent(ref event);这样获取不到不知道怎么处理
    还望大家不吝赐教!
      

  17.   

    public struct TV_Event
    {
    public long Type; 
    public object data;?????object怎么来的?
    }能不能把这个结构体原型写出来?
      

  18.   

    结构体原型#define MaxDataLen 46typedef struct{
    long Result;
    char ptrData[MaxDataLen]; ///还有这个怎么写???
    }DATASTR;typedef struct {
    long Type; 
    DATASTR data;
    }TV_Event;谢谢!
      

  19.   

    [StructLayout(LayoutKind.Sequential)]
    struct DATASTR
    {
      int Result;
      [MarshalAs(ByValArray,SizeConst=46)]
      char[] prtData;
    }[StructLayout(LayoutKind.Sequential)]
    struct TV_Event;
    {
      int Type;
      DATASTR data;
    }
      

  20.   

    谢谢!但是上面提到的主要问题怎么解决啊?我用
    TV_GetEvent(ref TV_Event event);然后调用TV_Event event = new TV_Event();
    TV_GetEvent(ref event);怎么调用啊?
      

  21.   

    还是不对啊!event.Type 的值 558726351301902377;应该是出错了!怎么回事啊?