高手请进,一个软件控制问题 怎样实现控制其他程序窗体上的窗口控件之后,弹出我的对话框,输入验证码后运行我的程序,通过验证,对方程序继续运行? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你监控另一程序窗体上的控件,你找到对方句柄和控件文本名后,你的程序就运行,**并马上用SuspendThread将目标程序挂起**,相当拦截了对方对某一控件的操作,当你的程序运行通过后,**用ResumeThread恢复目标程序**,对方程序继续运行! 超级绿豆,SuspendThread和ResumeThread还是不管用,你有没有一个简单的实验例子! SuspendThread不管用?不会吧...... 用钩子:如下:拦截目标程序上控件的消息,符合要求向系统传递,否则吃掉信息:我的dll还有2个问题:1 用sethook只能挂一次,即使卸载钩子,再挂钩时导致目标程序出现“内存不能为read错误”,目标程序挂掉。2 dll中回调函数 CallWndProc中SetWindowText(x1,"Q");不起作用,但是如果用vb直接调用SetWindowText(x1,"Q");则可以动作.Option ExplicitPrivate Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As LongPrivate 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 LongPrivate Declare Function getnum Lib "a1" (ByVal hwnd As Long) As LongPrivate Declare Function SetHook Lib "a1" (ByVal hwnd As Long) As LongPrivate Const GW_CHILD = 5Private Const GW_HWNDNEXT = 2'说明:以下程序需要,窗体test,按钮command1,command2以及一个文本框'程序作用:VC制作的dll挂钩柄截取按钮的指定消息,并由dll触发vb文本框的change事件'在运行本程序前请制作一个包括3个按钮的exe文件,先运行该exe文件。Private Sub Command1_Click()Dim h As LongDim mainh As LongDim h1 As LongDim h2 As LongDim h3 As LongDim title As StringDim h4 As LongDim s1 As String * 225mainh = FindWindow(vbNullString, "Form1") '找到要挂钩的Form1窗体句柄h2 = GetWindow(mainh, GW_CHILD)GetWindowText h2, s1, 225title = Mid(s1, 1, InStr(1, s1, Chr(0)) - 1)If title = "Command2" Thenh3 = h2ElseDoh3 = GetWindow(h2, GW_HWNDNEXT)GetWindowText h3, s1, 225title = Mid(s1, 1, InStr(1, s1, Chr(0)) - 1)Loop Until (title = "Command2") '找到按钮Command2句柄h4 = getnum(Text1.hwnd) '给dll传送文本框句柄h = SetHook(h3) '传送按钮Command2句柄,挂钩End IfEnd SubPrivate Sub Command2_Click()Dim h As Longh = SetHook(0) '卸除钩子UnhookEnd 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 a1EXPORTSmyfun @1getnum @2SetHook @3 Shell32.FolderItem是一个什么类型? 请大虾帮忙(在线等!!!!!!!!!!!!!!!) 关于GetPrivateStringValue的返回值,恳求指点 简单的VB打印问题 有关mschart打印问题 怎样才能实现对文本文件中的内容进行分析,取出有用的数据呢??? rs_user.RecordCount的值为-1,为什么?? Win98 下 ADO 出错的问题,求救!!! vb 有在“北京思元软件有限公司 ”工作或工作过的吗,这公司怎么样 如何做弹出窗体的控件???????????? vb连接mysql数据库的大难题 如何在VB中创建一个隐藏且系统受保护的文件夹呢?
如下:拦截目标程序上控件的消息,符合要求向系统传递,否则吃掉信息:
我的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