但是你又不想用timer,应该也不会想影响程序的工作吧。
给个方向性建议,建立一个新搭哗或的线程,然后让它运行一个过程,这个过程有一个循环,不断循环判断直到内存某数据改变。可以用sleep这个api函数来控制这个循环每次的间隔。这样就可以不影响前台工作。
你可以从外部终止这个线程,达到终止循环的目的
我这里就只说说实现原理,而不作详细的程序了。首先是利用ToolHelp32工具枚举获取qq.exe所在的进程ID,
CreateToolhelp32Snapshot(), ProcessFirst32(), 等等,
然后根据所获得的进程ID,利用OpenProcess打开并取得其hProcess,
跟着读出该进程的数据区,利用ReadProcessMemory()实现(过程中应注意速度,作出筛选&优化)
尔后扫描所获得的数据"\msgex.db"的位置,前首派伍面的东东就是QQ号码了。
这是比较简单的方法,至于还有一些更好的,不过我这就不再多作羡岁冗言者或赘句了。
至于跟着怎么把他读出来显示在文本框上,Text1.Text = lpszQQNumber 就行了嘛。
‘获取当前的程序内肆燃和存占用(生成exe后运行):Private Sub Timer1_Timer()
Dim myUsage As Double
myUsage = RamUsage
Label1.Caption = FormatUsage(myUsage) &"K (" &FormatUsage(myUsage / 1024) &" Mb)"
End Sub
Private Function RamUsage(Optional strProcess As String = "") As Double
If strProcess = "" Then strProcess = UCase(App.EXEName) &".EXE" 'Will count the current application as the process if no arguments given
Set objWMIService = GetObject("winmgmts:" &"{impersonationLevel=impersonate}!\裂盯\.\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='" &strProcess &"'")
For Each objProcess In colProcessList
RamUsage = objProcess.workingSetSize / 1024
Next
End Function
Private Function FormatUsage(tUsage As Double)
If Int(tUsage) = tUsage Then
If tUsage = 0 Then
FormatUsage = 0
Else
FormatUsage = Format(tUsage, "###,###")
End If
Else
FormatUsage = Format(tUsage, "段羡###,###.#")
End If
End Function
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)