把原来的 Public Sub HookInputBoxThread() 这个函数头 替换成 Public function HookInputBoxThread(ByVal param As Long) as long 就可以了
大家可以看一下MSDN,其中的线程函数是要这样申明的。 DWORD WINAPI ThreadProc( LPVOID lpParameter // thread data );----------------------------- 换成VB就是应该:Public function ThreadProc(ByVal lpParameter As Long) as long
天同,你好!你说的方法仍是不行的,你试过没有呢?不过我在想,问题也许不是这个函数的问题因为我在执行的过程中INPUTBOX窗已经弹出,输入时的效果也是对的只是在ENTER或中按了确定之后系统提示内存不可读之类的然后就终断了程序的执行在我的那个函数里是一个 Do Until g_bDone loop在输入之前 g_bDone=true在什么位置使 g_bDone=false 呢我想这样应该不会再读不到那个窗体的句柄而使内存不可读了,你看对不?
'把以下代码放在模块文件里 Public Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode As Long)Public Const EM_SETPASSWORDCHAR = &HCCPublic g_bDone As Boolean Public g_strTitle As StringPublic Function HookInputBoxThread(ByVal param As Long) As Long Dim h As Long, hText As Long Do Until g_bDone h = FindWindow("#32770", g_strTitle) If h <> 0 Then hText = GetDlgItem(h, &H1324) If hText <> 0 Then SendMessage hText, EM_SETPASSWORDCHAR, Asc("*"), ByVal 0 g_bDone = True End If End If Loop HookInputBoxThread = 0 End Function'----------------测试--------------------- Private Sub Command1_Click() Dim hThread As Long g_bDone = False Dim S As String g_strTitle = "ABC" hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf HookInputBoxThread, ByVal 0&, 0, lpThreadID) If hThread <> 0 Then CloseHandle hThread End If S = InputBox("请输入密码", g_strTitle) MsgBox S End Sub’-------------------以上代码测试通过------------------------------- 需要注意的地方 1。必须编译为p-code 2。必须编译出来之后执行,不能在VBIDE下执行
好吧!你说送就送了 现在我还可以讲给大家更多的送分秘密的。
应该怎样才不叫送分! 要我搞平均主义? 不是说大家不好,但实际上很多人是说不出什么有实际意义的东西的 也要给他们给分吗? 谁的态度正确,谁的回答正确 我就给谁,这样不对吗? 我还可以真实的讲给大家 他们说的他是我们公司的总工程师 他很少玩CSDN的 只是老跑他办公室不方便 才要求他登记个帐户的 另外,我是存有一定的私心的 但我也认为他回答的就是比别人好,这是可以查证的 这种事我可能还要继续下去的 这种情况CSDN不允许吗? 办个CSDN的目的和意义是什么? 你来CSDN的目的和意义又是什么? 不知大家看了我在CSDN上的问题的交流又有何说 但我自己可以坦然说,我不是那种无聊之徒 时间有限,不多说了 还请各位多多指正!http://www.csdn.net/expert/topic/870/870135.xml?temp=.4205438
我记得好象可以呀,微软还提供了一个例子,我运行过的。
h = FindWindow("#32770", g_strTitle)
hText = GetDlgItem(h, &H1324)
这两个语句把它放在主程序里面
把h和hText设定为全局变量试一下,建议你以后的程序抽象后贴出来,ok?
请看看,他的问题跟你差不多。不过你的中间过程复杂多了,这个我试过的:
http://www.csdn.net/expert/topic/879/879758.xml?temp=.7444879
2.DoEvents不要再THREAD中用
Public Sub HookInputBoxThread()
这个函数头
替换成
Public function HookInputBoxThread(ByVal param As Long) as long
就可以了
DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
);-----------------------------
换成VB就是应该:Public function ThreadProc(ByVal lpParameter As Long) as long
先创建一个空的线程,编译运行没有任何问题,如果加上调用API函数马上Game Over,要先解决这个问题,才能继续探讨
1。最好使用VB5来编译,它比VB6要稳定
2。编译出来之后必须为P-CODE,否则会出现GPE错误
3。如果编译出来不是P-CODE,则在代码里不能使用API函数,也不能使用部分的VB函数,包括,left,mid等函数(有参数的函数),但可以使用自己编的函数,可以使用全局变量等。
4。不能直接在VB IDE下直接调试及运行。
Public Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode As Long)Public Const EM_SETPASSWORDCHAR = &HCCPublic g_bDone As Boolean
Public g_strTitle As StringPublic Function HookInputBoxThread(ByVal param As Long) As Long
Dim h As Long, hText As Long
Do Until g_bDone
h = FindWindow("#32770", g_strTitle)
If h <> 0 Then
hText = GetDlgItem(h, &H1324)
If hText <> 0 Then
SendMessage hText, EM_SETPASSWORDCHAR, Asc("*"), ByVal 0
g_bDone = True
End If
End If
Loop
HookInputBoxThread = 0
End Function'----------------测试---------------------
Private Sub Command1_Click()
Dim hThread As Long
g_bDone = False
Dim S As String
g_strTitle = "ABC"
hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf HookInputBoxThread, ByVal 0&, 0, lpThreadID)
If hThread <> 0 Then
CloseHandle hThread
End If
S = InputBox("请输入密码", g_strTitle)
MsgBox S
End Sub’-------------------以上代码测试通过-------------------------------
需要注意的地方
1。必须编译为p-code
2。必须编译出来之后执行,不能在VBIDE下执行