怎样实现控制其他程序窗体上的窗口控件之后,弹出我的对话框,输入验证码后运行我的程序,通过验证,对方程序继续运行?

解决方案 »

  1.   

    你监控另一程序窗体上的控件,你找到对方句柄和控件文本名后,你的程序就运行,**并马上用SuspendThread将目标程序挂起**,相当拦截了对方对某一控件的操作,当你的程序运行通过后,**用ResumeThread恢复目标程序**,对方程序继续运行!
      

  2.   

    超级绿豆,SuspendThread和ResumeThread还是不管用,你有没有一个简单的实验例子!
      

  3.   

    SuspendThread不管用?不会吧......
      

  4.   

    用钩子:
    如下:拦截目标程序上控件的消息,符合要求向系统传递,否则吃掉信息:
    我的dll还有2个问题:
    1 用sethook只能挂一次,即使卸载钩子,再挂钩时导致目标程序出现“内存不能为read错误”,目标程序挂掉。
    2 dll中回调函数 CallWndProc中SetWindowText(x1,"Q");
    不起作用,但是如果用vb直接调用SetWindowText(x1,"Q");则可以动作.Option Explicit
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Private Declare Function getnum Lib "a1" (ByVal hwnd As Long) As Long
    Private Declare Function SetHook Lib "a1" (ByVal hwnd As Long) As LongPrivate Const GW_CHILD = 5
    Private Const GW_HWNDNEXT = 2
    '说明:以下程序需要,窗体test,按钮command1,command2以及一个文本框
    '程序作用:VC制作的dll挂钩柄截取按钮的指定消息,并由dll触发vb文本框的change事件
    '在运行本程序前请制作一个包括3个按钮的exe文件,先运行该exe文件。
    Private Sub Command1_Click()
    Dim h As Long
    Dim mainh As Long
    Dim h1 As Long
    Dim h2 As Long
    Dim h3 As Long
    Dim title As String
    Dim h4 As Long
    Dim s1 As String * 225
    mainh = FindWindow(vbNullString, "Form1") '找到要挂钩的Form1窗体句柄
    h2 = GetWindow(mainh, GW_CHILD)
    GetWindowText h2, s1, 225
    title = Mid(s1, 1, InStr(1, s1, Chr(0)) - 1)If title = "Command2" Then
    h3 = h2
    Else
    Do
    h3 = GetWindow(h2, GW_HWNDNEXT)
    GetWindowText h3, s1, 225
    title = Mid(s1, 1, InStr(1, s1, Chr(0)) - 1)
    Loop Until (title = "Command2") '找到按钮Command2句柄h4 = getnum(Text1.hwnd) '给dll传送文本框句柄
    h = SetHook(h3) '传送按钮Command2句柄,挂钩
    End If
    End SubPrivate Sub Command2_Click()
    Dim h As Long
    h = SetHook(0) '卸除钩子
    Unhook
    End SubPrivate Sub Text1_Change()    Select Case Text1.Text
        Case "Q"
        MsgBox "", vbCritical, ""
        End Select
        End Sub#include <windows.h>#pragma data_seg("shared") 
    HHOOK g_hProc = NULL; // 窗口过程钩子句柄 
    HWND g_hRich = NULL; // 文本框句柄 
    HINSTANCE g_hInstDLL=NULL; //DLL实例句柄
    #pragma data_seg() #pragma comment(linker, "/section:shared,rws") 
    BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,
    LPVOID lpReserved)
    {
    g_hInstDLL=hModule;
    return TRUE;
    }
    ///////////////////////////////////////////HWND x1;
    long __stdcall getnum(HWND p1)
    {
    x1=p1;
    return 0;
    }long __stdcall set1() //参数p1,p2
    { //计算代码
    SetWindowText(x1,"Q");//SetWindowText函数 不执行动作????return 0;
    }long __stdcall myfun() //参数p1,p2
    { //计算代码
    Beep(900,5);
    set1();
    return 0;
    }//回调  函数
    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) 

    CWPSTRUCT *p = (CWPSTRUCT *)lParam; 
    // 捕获"发送"按钮 
    if (p->message == WM_COMMAND && LOWORD(p->wParam) == 2) 
    {
    myfun();
    }
    else
    //执行 相应 动作
    //////////////////////////////////////////////////////////
    {
     return CallNextHookEx(g_hProc, nCode, wParam, lParam); 
    }

    // 挂接钩子 
    long __stdcall WINAPI SetHook(HWND ju2)
    {
    long bRet ;
    DWORD dwThreadID;if (ju2 != NULL) 
    {
    // 挂接钩子
    dwThreadID =GetWindowThreadProcessId(ju2, NULL);  
    g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDLL, dwThreadID); 
    bRet = 1;
     }
    else 

    // 卸载钩子 
    UnhookWindowsHookEx(g_hProc); 
    g_hProc = NULL; 
    g_hRich = NULL; 
    bRet=1;

    return  bRet;
    }
    ********************************************************************
    def文件内容:
    LIBRARY a1
    EXPORTS
    myfun @1
    getnum @2
    SetHook @3