使用指针的话,请用 unsafe关键字,指标编译器以下是非托管代码.使用windows消息,刚对窗口的WinProc方法进行重载。相关资料可以在CDDN上查到很多。

解决方案 »

  1.   

    谁说vb 不能处理windows 消息?没有VB做不到的,你别忘了不管是C++ 还是什么,所有的EXE 都只是伪API封装,除非是VXDDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long这些够用了吧?呵呵不过,VB 和C# 如果你是在选择那当然是C#,VB之所以有市场是因为它编程快,但现在C# 更快,又有大量VB不能做的,何乐而不为之?
      

  2.   

    我觉得C#中处理指针可以很少用到,但处理Windows消息是常常可以用到的。
    重载WinProc方法即可。
      

  3.   

    例:这是我去年写的一个网游外挂的快键代码,就是专门拦消息的,呵呵Attribute VB_Name = "SethotKey"
    Option Explicit'   --------- command : --------- 阿利 01.9.7
    '
    '   Call enHotKey(Me.hwnd, ID, KeyString)
    '   Call deHotKey(Me.hwnd, ID)
    '
    '   ID可随便取,deHotKey 的ID 需与enHotKey 的ID 相同
    '   例:Call enHotKey(Me.hwnd, 1, "M") 则设置为附加键+M
    'Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As LongPrivate Const WM_HOTKEY = &H312
    Private Const MOD_ALT = &H1
    Private Const MOD_CONTROL = &H2
    Private Const MOD_SHIFT = &H4
    Private Const GWL_WNDPROC = (-4)Private HotKeyHasRead As Boolean
    Private preWinProc As Long
    Private Modifiers As LongPrivate Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_HOTKEY Then Call HotKeyPoc(wParam)    '将之送往原来的Window Procedure
        wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
    End FunctionPrivate Sub StartHotKey(ByVal Obj As Long)
        preWinProc = GetWindowLong(Obj, GWL_WNDPROC)
        Obj = SetWindowLong(Obj, GWL_WNDPROC, AddressOf wndproc)
        
        '定义组合键
        Modifiers = MOD_CONTROL
        HotKeyHasRead = True
    End SubPrivate Sub EndHotKey(ByVal Obj As Long)
        Obj = SetWindowLong(Obj, GWL_WNDPROC, preWinProc)
        HotKeyHasRead = False
    End SubPublic Sub enHotKey(ByVal Obj As Long, ObjNo As Integer, ObjKey As String)
        If ObjKey <> "" Then
            If Not HotKeyHasRead Then Call StartHotKey(Obj)
            Obj = RegisterHotKey(Obj, ObjNo, Modifiers, Asc(ObjKey))
        End If
    End SubPublic Sub deHotKey(ByVal Obj As Long, ObjNo As Integer)
        Dim ret As Long
        '取消Message的截取,而使之又只送往原来的Window Procedure
        Call UnregisterHotKey(Obj, ObjNo)
    End SubPublic Sub chkUserEndHotKey(ByVal Obj As Long)
        With fm_Main
            If .chk_hk_1 = 0 And .chk_hk_2 = 0 Then
                Call EndHotKey(Obj)
            End If
        End With
    End SubPublic Sub PrjQuitDeKey(ByVal Obj As Long, ByVal MaxHotKeyID As Long)
        Dim i As Integer
        For i = 1 To MaxHotKeyID
            Call deHotKey(Obj, i)
        Next
        Call EndHotKey(Obj)
    End SubPublic Sub HotKeyPoc(ObjKey As Long).....
      

  4.   

    C,VB,C#都可以做到C++可以做到的事,只是麻烦而已!
    他们都可以直接调用API,那还有什么作不到的!
      

  5.   

    多谢各位,既然上面各位大侠说了几个示例,就顺带提一下, ArLi2003(阿利 无业悠民)谈到的用VB捕捉WINDOWS消息的程式我也会,只不过在VISUAL BASIC中使用了这些程序后,VB就不可以进行调试运行,否则一中断就会出现非法操作然后退出,如果说要那样编程就可以算是VB直接支持WINDOWS消息的话,我只有晕倒了。不知Vb.net或C#.NET对此是否有好一点的支持?指针的问题我在C#中也试了一下,但我在事件中使用unsafe char* a;但环境提示不能使用不安全代码。
      

  6.   

    1,VB 拦了消息在IDE 之前所以IDE 的调试会不正常,但你只要注意在中断前一定要取消对消息拦接的钩子就可以了(RegisterHotKey 也是一种消息拦载,也必须注销钩子,一般在调试时不应该启动注册这个钩子,等发布时才启用)2,不安全代码你要降纸你的警告等级3,.net 语言就好象IL 语言积木,不同的语言只是该积木的包装,只是将多个的积木包在一起扩展成新的积木,所以它允许你跨语言,它甚至允许你直接使用原始的积木(IL 汇编):using System;
    using System.Threading;
    using System.Reflection;
    using System.Reflection.Emit;class DynamicJumpTableDemo{   public static Type BuildMyType()
       {
        AppDomain myDomain = Thread.GetDomain();
        AssemblyName myAsmName = new AssemblyName();
        myAsmName.Name = "MyDynamicAssembly";    AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(
                            myAsmName,
                            AssemblyBuilderAccess.Run);
        ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule(
                            "MyJumpTableDemo");    TypeBuilder myTypeBuilder = myModBuilder.DefineType("JumpTableDemo",
                                TypeAttributes.Public);
        MethodBuilder myMthdBuilder = myTypeBuilder.DefineMethod("SwitchMe", 
                                 MethodAttributes.Public |
                                 MethodAttributes.Static,
                                                 typeof(string), 
                                                 new Type[] {typeof(int)});    ILGenerator myIL = myMthdBuilder.GetILGenerator();    Label defaultCase = myIL.DefineLabel();    
        Label endOfMethod = myIL.DefineLabel();        Label[] jumpTable = new Label[] { myIL.DefineLabel(),
                          myIL.DefineLabel(),
                          myIL.DefineLabel(),
                          myIL.DefineLabel(),
                          myIL.DefineLabel() };    myIL.Emit(OpCodes.Ldarg_0); //Ldarg_0 作用是将索引为 0 的参数加载到计算堆栈上
        myIL.Emit(OpCodes.Switch, jumpTable);
    ....这就是IL 的汇编语言用法,你参考一下 OpCodes 类就知道了,指针与之相比呵呵
      

  7.   

    顺便提一下,如果各位有什么心得经验,或有什么学习C#或VB。Net的好网址、原程序,不妨发个email给我,我的EMAIL地址是[email protected],谢谢各位。