zoukankan      html  css  js  c++  java
  • Hook和数据库访问

    1.安装Hook过程屏蔽鼠标键盘消息

    新建一个基于对话框的MFC应用程序,取名InnerHook,CInnerHookDlg类上的OnInitDialog函数中安装Hook过程,编辑InnerHookDlg.cpp,如下:

    //全局变量,用来保存键盘钩子过程的句柄 
    HHOOK g_hKeyboard=NULL; 
    HHOOK g_hMouse=NULL; 
    HWND g_hWnd=NULL; 
    LRESULT CALLBACK MouseProc( 
      int nCode,      // hook code 
      WPARAM wParam,  // message identifier 
      LPARAM lParam   // mouse coordinates 
    )//
    鼠标消息过程 

        return 1

     
    LRESULT CALLBACK KeyboardProc( 
      int code,       // hook code 
      WPARAM wParam,  // virtual-key code 
      LPARAM lParam   // keystroke-message information 
    )//
    键盘消息过程 

    /*    //if(VK_SPACE==wParam||VK_RETURN==wParam)//
    屏蔽空格与键 
        if(VK_F4==wParam && (1==(lParam>>29 & 1))) 
            return 1; 
        else 
            return CallNextHookEx(g_hKeyboard,code,wParam,lParam); 
    */ 
        if(VK_F2==wParam) 
        { 
            ::SendMessage(g_hWnd,WM_CLOSE,0,0); 
            UnhookWindowsHookEx(g_hKeyboard);//
    移除hook过程 
            UnhookWindowsHookEx(g_hMouse); 
        } 
        return 1
    }
     
     
    BOOL CInnerHookDlg::OnInitDialog() 

        ......... 
        ......... 
        // TODO: Add extra initialization here 
        g_hWnd=m_hWnd; 
        g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());//
    安装鼠标钩子过程  
        g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());//
    安装键盘钩子过程 
        return TRUE;  // return TRUE  unless you set the focus to a control 
    }

    2.屏蔽所有的进程与线程的键盘和鼠标消息

        钩子过程dll

    新建一个空的动态链接库工程,取名Hook,并新建一个C++源文件,也取名Hook,编辑:

    #include <windows.h> 
    HHOOK g_hMouse; 
    HINSTANCE g_hInst;//
    用来存放当前动态链接库模块的句柄 
    /* 
    //
    方式一 
    BOOL WINAPI DllMain( 
      HINSTANCE hinstDLL,  // handle to the DLL module 
      DWORD fdwReason,     // reason for calling function 
      LPVOID lpvReserved   // reserved 
    )//
    得到动态链接库模块的句柄 

        g_hInst=hinstDll; 

    */ 
    LRESULT CALLBACK MouseProc( 
      int nCode,      // hook code 
      WPARAM wParam,  // message identifier 
      LPARAM lParam   // mouse coordinates 
    )//
    鼠标的钩子过程 

        return 1

     
    void SetHook() 

        //SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInst,0);    //
    方式一 
        g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);//
    方式二 
        //
    安装鼠标钩子过程与当前的所有进程相关,并返回钩子过程的句柄给g_hMouse; 
        //
    其中GetModuleHandle是得到动态链接库模块的句柄
    }

    再在Hook工程目录下,新建一个def文件,取名Hook.def,添加到工程,编辑:

    LIBRARY Hook

    EXPORTS

    SetHook        @2

        调用Hook.dll的客户端程序

    新建一个MFC基于单文档的应用程序,在HookTestDlg.cpp中编辑:

    // CHookTestDlg message handlers 
    #pragma comment(lib,"..\\Hook\\Debug\\Hook.lib")//
    引入库文件 
    _declspec(dllimportvoid SetHook();//
    声明这个函数是从动态链接库中引入的 
    BOOL CHookTestDlg::OnInitDialog() 

        .......... 
        .......... 
        // TODO: Add extra initialization here 
        SetHook();//
    调用这个Hook.dll中的函数,安装钩子过程 
        return TRUE;  // return TRUE  unless you set the focus to a control 
    }

        键盘钩子

    Hook.cpp中添加:

    #include <windows.h> 
    HHOOK g_hMouse=NULL; 
    HHOOK g_hKeyboard=NULL; 
    HWND g_hWnd;//
    定义一个全局的句柄用来存放Hook.dll的句柄 
     
    LRESULT CALLBACK MouseProc( 
      int nCode,      // hook code 
      WPARAM wParam,  // message identifier 
      LPARAM lParam   // mouse coordinates 
    )//
    鼠标钩子过程 

        return 1

     
    LRESULT CALLBACK KeyboardProc( 
      int nCode,      // hook code 
      WPARAM wParam,  // message identifier 
      LPARAM lParam   // mouse coordinates 
    )//
    键盘钩子过程 

        if(VK_F2==wParam) 
        { 
            SendMessage(g_hWnd,WM_CLOSE,0,0);//
    发送关闭窗口的消息 
            UnhookWindowsHookEx(g_hMouse);//
    移除鼠标钩子 
            UnhookWindowsHookEx(g_hKeyboard);//
    移除键盘钩子 
        } 
        return 1
    }
     
     
    void SetHook(HWND hwnd)//
    通过一个参数将这个Hook.dll句柄传进来 

        g_hWnd=hwnd; 
        //SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInst,0);    //
    方式一 
        g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);//
    方式二 
        //
    安装鼠标钩子过程与当前的所有进程相关,并返回钩子过程的句柄给g_hMouse; 
        //
    其中GetModuleHandle是得到动态链接库模块的句柄 
        g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0); 
    }

    HookTestDlg.cpp中编辑:

    #pragma comment(lib,"..\\Hook\\Debug\\Hook.lib")//引入库文件 
    _declspec(dllimportvoid SetHook(HWND hwnd);//
    声明这个函数是从动态链接库中引入的 
     
    BOOL CHookTestDlg::OnInitDialog() 

        ........... 
        ........... 
        SetHook(m_hWnd);//
    调用这个Hook.dll中的函数,安装钩子过程 
        return TRUE;  // return TRUE  unless you set the focus to a control 
    }

    3.设置窗口最顶层且最大化

    编辑CHookTestDlg::OnInitDialog函数:

    BOOL CHookTestDlg::OnInitDialog() 

        ............ 
        ............     
        // TODO: Add extra initialization here 
        int cxScreen,cyScreen; 
        cxScreen=GetSystemMetrics(SM_CXSCREEN);//
    获取屏幕的宽度 
        cyScreen=GetSystemMetrics(SM_CYSCREEN);//
    获取屏幕的高度 
        SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);//
    设置窗口的大小 
        SetHook(m_hWnd);//
    调用这个Hook.dll中的函数,安装钩子过程 
        return TRUE;  // return TRUE  unless you set the focus to a control 
    }

    4.利用节关闭非当前窗口

    Hook.cpp中编辑:

    #include <windows.h> 
    HHOOK g_hMouse=NULL; 
    HHOOK g_hKeyboard=NULL; 
     
    #pragma data_seg("MySec")//
    创建一个名字为MySec的节 
    //
    注意:节的名字要在8个字符以内,超出部分被截掉 
    HWND g_hWnd=NULL;//
    定义一个全局的句柄用来存放Hook.dll的句柄 
    #pragma data_seg() //
    节的结尾,这样成员变量g_hWnd就在MySec这个节当中了 
    //
    注意:只有被初始化了的变量才会被放置在节当中 
     
    //
    MySec这个节设置成共享的节 
    //
    方式一 
    //#pragma comment(linker,"/section:MySec,RWS")//
    设置这个节为读写共享(RWS) 
    //
    方式二:在def文件当中添加 
    /* 
    SEGMENTS 
    MySec    READ WRITE SHARED 
    */
     
    .......... 
    ..........

    Hook.def文件中添加:

    SEGMENTS 
    MySec    READ WRITE SHARED 

    编译后,将Hook.dll文件拷贝到HookTest工程下,然后再次运行HookTest测试程序,再按Alt+Tab键切换到其这程序下,按F2,测试程序依然退出了。

    5.数据库的编程

    VB中利用ADO访问数据库

    新建一VB工程,向窗体添加两个控件(ADO Data Control 6.0)(DataGrid Control 6.0),并拖到表单中,在Adodc1上点右键->属性->使用连接字符串(生成)->{提供程序(OLE DB Provider for SQL Server),连接[(用户名:sa,密码:luwei),数据库(test)]}->确定->记录源->命令类型(2-adCmdTable)->确定。 DataGrid控件的数据源选择Adodc1,运行,可以看到数据在DataGrid表控件中

        再新建一个VB工程,向窗体拖入一个列表框和按钮,双击按钮,编辑:

    Private Sub Command1_Click() 
    Dim conn As New ADODB.Connection 
    '
    定义连接对象 
     
    'Dim rst As ADODB.Recordset 
    '
    定义记录集对象 
    Dim rst As New ADODB.Recordset 
     
    Dim cmd As New ADODB.Command 
    '
    定义Command对象 
     
    conn.ConnectionString = "Provider=SQLOLEDB.1;Password=luowei;Persist Security Info=True;User ID=sa;Initial Catalog=test" 
    '
    给连接字串赋值 
    conn.Open 
     
    '
    方式一 
    'Set rst = conn.Execute("select * from S") 
    '
    方式二 
    'rst.ActiveConnection = conn 
    'rst.Open ("select * from S") 
    '
    方式三 
    cmd.ActiveConnection = conn 
    cmd.CommandText = "select * from S" 
    Set rst = cmd.Execute 
     
    Do Until rst.EOF 
        List1.AddItem rst("sname"
        rst.MoveNext 
    '    
    循环取数据 
    Loop 
    End Sub

    运行,OK !!

    VC中利用ADO访问数据库

        新建一个基于对话框的MFC应用程序,取名:Ado,然后在对话框资源上添加一个列表框与按钮(id: IDC_BTN_QUERY,Caption:查询),双击,添加消息响应函数.

    首先在预编译头文件中添加:

    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace 
    //
    导入ADO动态链接库

    编译,将生成的msado15.tlhmsado15.tli导入到工程中,以便查看。

    然后再编辑按钮的消息响应函数,如下:

    void CAdoDlg::OnBtnQuery()  

        // TODO: Add your control notification handler code here 
        CoInitialize(NULL);//
    初始化COM 
        _ConnectionPtr pConn(__uuidof(Connection));//
    产生一个Connection智能指针对象 
        _RecordsetPtr pRst(__uuidof(Recordset));//
    产生一个记录集的智能指针对象 
        _CommandPtr pCmd(__uuidof(Command));//
    产生一个Command智能指针对象 
         
        pConn->ConnectionString="Provider=SQLOLEDB.1;Password=luowei;Persist Security Info=True;User ID=sa;Initial Catalog=test"
        //
    通过连接字符串连接数据库 
        pConn->Open("","","",adConnectUnspecified);//
    打开数据库 
         
        //
    方式一 
        //pRst=pConn->Execute("select * from S",NULL,adCmdText); 
     
        //
    方式二 
        //pRst->Open("select * from S",_variant_t((IDispatch*)pConn),adOpenDynamic,adLockOptimistic,adCmdText); 
     
        //
    方式三 
        pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));//
    设置活动连接 
        pCmd->CommandText="select * from S";//
    设置命令文本 
        pRst=pCmd->Execute(NULL,NULL,adCmdText); 
     
        while(!pRst->rsEOF) 
        { 
            ((CListBox*)GetDlgItem(IDC_LIST1))->AddString( 
                (_bstr_t)pRst->GetCollect("sname")); 
            pRst->MoveNext();//
    游标向下移 
        } 
        pRst->Close();//
    关闭记录集 
        pConn->Close();//
    关闭连接 
        pRst.Release();//
    释放智能指针在引用接口上的使用记数 
        pConn.Release(); 
        CoUninitialize();//
    卸载COM 
    }

    运行 ok!!

  • 相关阅读:
    MySQL具体解释(19)----------海量数据分页查询优化
    初试 Windows XP Embedded 系统开发1
    四元数(Quaternion)和旋转
    Qt动画效果的实现,QPropertyAnimation
    <QtEndian>
    QString,QByteArray和QBitArray之间的转换
    memmove和memcpy
    QStyle
    QStyle 新风格的实现
    实时操作系统
  • 原文地址:https://www.cnblogs.com/luowei010101/p/2052283.html
Copyright © 2011-2022 走看看