jmjonson
asked on
Getting Dial up Networking bytes sent and recv.
I'm trying to get the bytes sent and recv. stats from DUN. i can't find any info on connecting a VB program into an active DUN connection and getting those(bytes sent and recv.)stats to put in
a textbox. I have everything else done
but pulling those two numbers out of the connection.
a textbox. I have everything else done
but pulling those two numbers out of the connection.
The solution I would use is to get the info off the window itself. Rather easily done using FindWindow, GetWindow and GetWindowText. If you are interested, I'll write up the code.
you might want to look at:
GetTcpStatistics function in IPHLPAPI.DLL. Do a search on MSDN or msdn.microsoft.com for IP Helper.
thanks,
GetTcpStatistics function in IPHLPAPI.DLL. Do a search on MSDN or msdn.microsoft.com for IP Helper.
thanks,
ASKER
thank for the help i have some code but only the connect speed is showing up.
So..., you are not interested?
ASKER
yes i'm interested, i can get the connected at 115,200 bps
and when i use the same function with the bytes sent parm all i can get is the bytes sent: no numbers which is what i'm after. the numbers after
bytes sent: ?????
bytes recived: ?????
duration: 000:00:00
this is what i want, if you can tell me
please. it's almost like i can read the
text but not the data that it can update.hmmmmmmmmm now to find out how to get the data.
and when i use the same function with the bytes sent parm all i can get is the bytes sent: no numbers which is what i'm after. the numbers after
bytes sent: ?????
bytes recived: ?????
duration: 000:00:00
this is what i want, if you can tell me
please. it's almost like i can read the
text but not the data that it can update.hmmmmmmmmm now to find out how to get the data.
this is just a little routine that will pretty much list all the info thats in the 'Connected' window. just add a listbox to the form:
*****Module Code*****
Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function EnumChildWindows Lib "user32" _
(ByVal hWndParent As Long, _
ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String, ByVal cch As Long) _
As Long
Public Function EnumWinProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinTitleBuf As String * 255
Dim WinTitle As String
RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
WinTitle = Trim$(StripNulls(WinTitleB uf))
If Left(WinTitle, 9) = "Connected" Then
Form1.Caption = WinTitle
RetVal = EnumChildWindows(lhWnd, AddressOf EnumChildProc, lParam)
End If
EnumWinProc = True
End Function
Public Function EnumChildProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinTitleBuf As String * 255
Dim WinTitle As String
RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
WinTitle = Trim$(StripNulls(WinTitleB uf))
If WinTitle > " " Then
Form1.List1.AddItem WinTitle
Form1.List1.ItemData(Form1 .List1.New Index) = lhWnd
End If
EnumChildProc = True
End Function
Public Function StripNulls(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
End If
StripNulls = OriginalStr
End Function
*****Form Code*****
Private Sub Form_Load()
EnumWindows AddressOf EnumWinProc, 0
End Sub
*****Module Code*****
Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function EnumChildWindows Lib "user32" _
(ByVal hWndParent As Long, _
ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String, ByVal cch As Long) _
As Long
Public Function EnumWinProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinTitleBuf As String * 255
Dim WinTitle As String
RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
WinTitle = Trim$(StripNulls(WinTitleB
If Left(WinTitle, 9) = "Connected" Then
Form1.Caption = WinTitle
RetVal = EnumChildWindows(lhWnd, AddressOf EnumChildProc, lParam)
End If
EnumWinProc = True
End Function
Public Function EnumChildProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinTitleBuf As String * 255
Dim WinTitle As String
RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
WinTitle = Trim$(StripNulls(WinTitleB
If WinTitle > " " Then
Form1.List1.AddItem WinTitle
Form1.List1.ItemData(Form1
End If
EnumChildProc = True
End Function
Public Function StripNulls(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
End If
StripNulls = OriginalStr
End Function
*****Form Code*****
Private Sub Form_Load()
EnumWindows AddressOf EnumWinProc, 0
End Sub
Yep, that's basically the code I had written...
Not very elegant I'm afraid...any other ideas KDivad?
My answer was similar except that I used GetWindow( , GW_HWNDNEXT/GW_HWNDCHILD) to run through the windows. It went a little farther in that it did find and extract the speed, upload/download bytes and duration instead of adding to a listbox. But other than that, I'm afraid I had little/nothing to offer.
ASKER
kdivad that's what i need the extracted upload and download bytes, duration data. i can list the text portions but the data isn't there, how oh how did you get the data out.please<---begging now.
what info are you talking about? arent the upload/download bytes the ones listed in the bytes received/bytes sent labels of the window?
this pretty much copies the screen in the connected box, add three labels and a timer to a form and paste this code:
****Module COde****
Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function EnumChildWindows Lib "user32" _
(ByVal hWndParent As Long, _
ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String, ByVal cch As Long) _
As Long
Public arr(40) As String
Public Scanning As Boolean
Public i As Integer
Public Function EnumWinProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinTitleBuf As String * 255
Dim WinTitle As String
RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
WinTitle = Trim$(StripNulls(WinTitleB uf))
If Left(WinTitle, 9) = "Connected" Then
Form1.Caption = WinTitle
RetVal = EnumChildWindows(lhWnd, AddressOf EnumChildProc, lParam)
End If
EnumWinProc = True
End Function
Public Function EnumChildProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinTitleBuf As String * 255
Dim WinTitle As String
RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
WinTitle = Trim$(StripNulls(WinTitleB uf))
If WinTitle > " " Then
arr(i) = WinTitle
i = i + 1
End If
EnumChildProc = True
End Function
Public Function StripNulls(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
End If
StripNulls = OriginalStr
End Function
****Form Code****
Private Sub Form_Load()
ScaleMode = 1
Width = 4035
Height = 2025
Label1 = "Duration: "
Label2 = "Bytes Received: "
Label3 = "Bytes Sent "
Label1.Left = 380
Label2.Left = 380
Label3.Left = 380
Label1.Top = 240
Label2.Top = 600
Label3.Top = 960
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub
Private Sub Scan()
If Scanning Then Exit Sub
Scanning = True
Label1 = "Duration: "
Label2 = "Bytes Received: "
Label3 = "Bytes Sent: "
EnumWindows AddressOf EnumWinProc, 0
Label1 = Label1 & arr(3)
Label2 = Label2 & arr(5)
Label3 = Label3 & arr(7)
i = 0
Scanning = False
End Sub
Private Sub Timer1_Timer()
If Not Scanning Then Scan
End Sub
****Module COde****
Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function EnumChildWindows Lib "user32" _
(ByVal hWndParent As Long, _
ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" (ByVal hwnd As Long, _
ByVal lpString As String, ByVal cch As Long) _
As Long
Public arr(40) As String
Public Scanning As Boolean
Public i As Integer
Public Function EnumWinProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinTitleBuf As String * 255
Dim WinTitle As String
RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
WinTitle = Trim$(StripNulls(WinTitleB
If Left(WinTitle, 9) = "Connected" Then
Form1.Caption = WinTitle
RetVal = EnumChildWindows(lhWnd, AddressOf EnumChildProc, lParam)
End If
EnumWinProc = True
End Function
Public Function EnumChildProc(ByVal lhWnd As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim WinTitleBuf As String * 255
Dim WinTitle As String
RetVal = GetWindowText(lhWnd, WinTitleBuf, 255)
WinTitle = Trim$(StripNulls(WinTitleB
If WinTitle > " " Then
arr(i) = WinTitle
i = i + 1
End If
EnumChildProc = True
End Function
Public Function StripNulls(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
End If
StripNulls = OriginalStr
End Function
****Form Code****
Private Sub Form_Load()
ScaleMode = 1
Width = 4035
Height = 2025
Label1 = "Duration: "
Label2 = "Bytes Received: "
Label3 = "Bytes Sent "
Label1.Left = 380
Label2.Left = 380
Label3.Left = 380
Label1.Top = 240
Label2.Top = 600
Label3.Top = 960
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub
Private Sub Scan()
If Scanning Then Exit Sub
Scanning = True
Label1 = "Duration: "
Label2 = "Bytes Received: "
Label3 = "Bytes Sent: "
EnumWindows AddressOf EnumWinProc, 0
Label1 = Label1 & arr(3)
Label2 = Label2 & arr(5)
Label3 = Label3 & arr(7)
i = 0
Scanning = False
End Sub
Private Sub Timer1_Timer()
If Not Scanning Then Scan
End Sub
Here's the code you want:
After running, the data will be contained in ConnectSpeed, UpLoad, DownLoad and Duration. They are all strings, so you will need to convert if you need something else.
Hope this IS what you want!
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Sub Form_Load()
Dim T_hWnd As Long
Dim cT_hWnd As Long
Dim WT As String
Dim ConnectSpeed As String
Dim UpLoad As String
Dim DownLoad As String
Dim Duration As String
'Dim cT_hWnd As Long
T_hWnd = GetWindow(GetDesktopWindow , GW_CHILD)
Do
WT = String$(255, 0)
x = GetWindowText(T_hWnd, WT, 255)
If Left$(WT, 13) = "Connected to " Then
cT_hWnd = GetWindow(T_hWnd, GW_CHILD)
Do
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
If Left$(WT, 13) = "Connected at " Then
ConnectSpeed = Right$(WT, Len(WT) - 13)
ConnectSpeed = Left$(ConnectSpeed, InStr(1, ConnectSpeed, Chr$(0)) - 1)
ElseIf Left$(WT, 9) = "Duration:" Then
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
Duration = Left$(WT, InStr(1, WT, Chr$(0)) - 1)
ElseIf Left$(WT, 15) = "Bytes received:" Then
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
DownLoad = Left$(WT, InStr(1, WT, Chr$(0)) - 1)
ElseIf Left$(WT, 11) = "Bytes sent:" Then
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
UpLoad = Left$(WT, InStr(1, WT, Chr$(0)) - 1)
End If
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
If cT_hWnd = 0 Then Exit Do
Loop
Exit Do
End If
T_hWnd = GetWindow(T_hWnd, GW_HWNDNEXT)
If T_hWnd = 0 Then Exit Do
Loop
End Sub
After running, the data will be contained in ConnectSpeed, UpLoad, DownLoad and Duration. They are all strings, so you will need to convert if you need something else.
Hope this IS what you want!
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Sub Form_Load()
Dim T_hWnd As Long
Dim cT_hWnd As Long
Dim WT As String
Dim ConnectSpeed As String
Dim UpLoad As String
Dim DownLoad As String
Dim Duration As String
'Dim cT_hWnd As Long
T_hWnd = GetWindow(GetDesktopWindow
Do
WT = String$(255, 0)
x = GetWindowText(T_hWnd, WT, 255)
If Left$(WT, 13) = "Connected to " Then
cT_hWnd = GetWindow(T_hWnd, GW_CHILD)
Do
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
If Left$(WT, 13) = "Connected at " Then
ConnectSpeed = Right$(WT, Len(WT) - 13)
ConnectSpeed = Left$(ConnectSpeed, InStr(1, ConnectSpeed, Chr$(0)) - 1)
ElseIf Left$(WT, 9) = "Duration:" Then
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
Duration = Left$(WT, InStr(1, WT, Chr$(0)) - 1)
ElseIf Left$(WT, 15) = "Bytes received:" Then
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
DownLoad = Left$(WT, InStr(1, WT, Chr$(0)) - 1)
ElseIf Left$(WT, 11) = "Bytes sent:" Then
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
UpLoad = Left$(WT, InStr(1, WT, Chr$(0)) - 1)
End If
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
If cT_hWnd = 0 Then Exit Do
Loop
Exit Do
End If
T_hWnd = GetWindow(T_hWnd, GW_HWNDNEXT)
If T_hWnd = 0 Then Exit Do
Loop
End Sub
Turns out that "Bytes sent:" and the data are in two different controls. This works on my system, so let me know if the data comes out mixed up (although they shouldn't...). The code assumes that the "Bytes sent:" and data labels are created in a specific order. If they mix up, it will require extra coding to check the locations of each label and adjust accordingly.
ASKER
alright i but this code in and steped thru it looking at the var. while it was running,
ElseIf Left$(WT, 9) = "Duration:" Then
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
Duration = Left$(WT, InStr(1, WT, Chr$(0)) - 1)
wt= Duration:
then wt=blank
duration=blank
it's like it can't see the data part only the label Duration: thank both of you for the help, maybe i'm just to stupid to get this to work, at less i get the connect at 115,200 to show up but i think that's a perm. label and not a changing data var. i think it's time to buy the big set of MSDN cd's.
what else do i have $300 for.lol
thanks again you can have the points just for being so smart and helping me out.
matt
ElseIf Left$(WT, 9) = "Duration:" Then
cT_hWnd = GetWindow(cT_hWnd, GW_HWNDNEXT)
WT = String$(255, 0)
x = GetWindowText(cT_hWnd, WT, 255)
Duration = Left$(WT, InStr(1, WT, Chr$(0)) - 1)
wt= Duration:
then wt=blank
duration=blank
it's like it can't see the data part only the label Duration: thank both of you for the help, maybe i'm just to stupid to get this to work, at less i get the connect at 115,200 to show up but i think that's a perm. label and not a changing data var. i think it's time to buy the big set of MSDN cd's.
what else do i have $300 for.lol
thanks again you can have the points just for being so smart and helping me out.
matt
did you try my code? it uses a timer and shows all the info i think you need updating it every second
i even went through the trouble of positioning the labels and all just right so you can view it easily...paste it exactly as it is
jmjonson, If AzraSound's code works, go ahead and give him the points. I would like to request a favor, though. If I send you a simple project, would you be willing to run it? All it will do is create a .txt file on your desktop that has the DUN window's structure. Even if AzraSound beat me to working code (AGAIN!!!! ;-)), I would like to get my code functioning properly.
i will look at it if youd like...and i would like to send you mine to see there are no flaws on other desktops
azrasound@aol.com
azrasound@aol.com
Forgot a small point:
jmjonson, the purpose of the project I mentioned was so that you could post the .txt file so that I could look at it. Using that file I could recreate the window and see what I need to do to "foolproof" the code.
jmjonson, the purpose of the project I mentioned was so that you could post the .txt file so that I could look at it. Using that file I could recreate the window and see what I need to do to "foolproof" the code.
ASKER
Adjusted points from 100 to 150
ASKER
sure i'll try, email jmjonson@mindspring.com
azra i tried your code and all i get is
the text labels, ie..bytes sent:
but no numbers. i've pasted both in new projects, even steped through the code using debug and the strings always come back the same,
print wt
"bytes sent: "
i would love to find a anwser to this
so i'm uping the points to 150.
if you want i'll email both of you the zip files of the 4 different projects this has spawned.
azra i tried your code and all i get is
the text labels, ie..bytes sent:
but no numbers. i've pasted both in new projects, even steped through the code using debug and the strings always come back the same,
print wt
"bytes sent: "
i would love to find a anwser to this
so i'm uping the points to 150.
if you want i'll email both of you the zip files of the 4 different projects this has spawned.
jmjonson,
Please be patient. AzraSound and I are trying through email to figure this out. We are all getting the problem you mentioned. My code is showing the values on the first run through but not on subsequent runs if the DUN window is hidden. If it's not hidden, I can get the values constantly. His apparently has a similar problem. I missed it before because I never just let it run, I always stepped through it and checked the values on each step. We are doing our best to figure this out.
jmjonson and AzraSound,
May I make a suggestion? Since AzraSound and I are cooperating in this venture, perhaps jmjonson can get community support to halve the points on this question. This way, he(?) can post another with the rest of the points so that we can split them. Fair?
KDivad
Please be patient. AzraSound and I are trying through email to figure this out. We are all getting the problem you mentioned. My code is showing the values on the first run through but not on subsequent runs if the DUN window is hidden. If it's not hidden, I can get the values constantly. His apparently has a similar problem. I missed it before because I never just let it run, I always stepped through it and checked the values on each step. We are doing our best to figure this out.
jmjonson and AzraSound,
May I make a suggestion? Since AzraSound and I are cooperating in this venture, perhaps jmjonson can get community support to halve the points on this question. This way, he(?) can post another with the rest of the points so that we can split them. Fair?
KDivad
as far as my code leaving blank labels, it can only mean that the order of the child windows in your DUN window is somehow different from mine...if you would please, download and run this project, it will list all running processes on your computer including child processes. after you run it, scroll through the results it creates in the listbox until you see the referece to the DUN window...below it will be all its child windows. please paste that information here so i can see the order that your child windows are being enumerated in.
http://www.winmag.com/columns/powertools/ptwinwatch.htm
http://www.winmag.com/columns/powertools/ptwinwatch.htm
I'll bet that if he tries the exact same code with the DUN window open, it'll work perfectly. That's what happened on mine.
yes your window must be visible for my code (or KDivad's code) to work. this is b/c both incorporate the use of the getwindowtext api. we use this information to ensure we are gathering the information from the correct window/process. actually, with just a few extra lines of code, if you start my program with your DUN window open, then close the DUN window, it will function. the reason being that right now, my code checks for the windowtext to ensure it grabs the correct information. however, after a single pass, it can store the processes handle, and use that as its reference for the remainder of the programs execution.
My code gets the information on the first pass regardless of whether it is open or not. I think I just figured out a "fix". The first pass can be used to store the window handles. Future passes can just retrieve the text straight from the windows. I'll have to try it out.
Later,
Later,
Nope, same problem as before. Seems the window doesn't bother to update when it is hidden. Probably because it wouldn't make much sense to have an ever changing caption when it can't be seen.
Another idea...
Another idea...
I'm getting closer, but the rest will have to wait until tomorrow...
heres what happens to my code, if this makes any sense, after the window is closed, every run through enumerating the running processes returns the values that were in the window last before it was closed. so two hours later, i'll run my program and it will bring up the bytes and duration time that was present two hours earlier when i closed the window.
ASKER
thank you both for the help, how do i get community support to split the points between ya'll? I got a guy that programms for MS i'm going to email him and see if he can get me some inside help. if they read these 75 points to both these people for thier help.
thanks again.
thanks again.
you post a question in the customer service area asking them to split the points for you and they will take care of it
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Community Support has reduced points from 150 to 75
Hello everyone,
I am reducing the points on this question to 75.
jmjonson: You can accept one of the Expert's comments as an answer to award the first half of the points. For the second Expert, you need to create a new question in this topic area. The title should be 'For ExpertName -- 10335956' using the appropriate Expert name and it should be for 75 points.
For your convenience, you can use this link to create the new question:
https://www.experts-exchange.com/bin/NewQForm?ta=31
darinw
Customer Service
I am reducing the points on this question to 75.
jmjonson: You can accept one of the Expert's comments as an answer to award the first half of the points. For the second Expert, you need to create a new question in this topic area. The title should be 'For ExpertName -- 10335956' using the appropriate Expert name and it should be for 75 points.
For your convenience, you can use this link to create the new question:
https://www.experts-exchange.com/bin/NewQForm?ta=31
darinw
Customer Service
ASKER
Thanks again, AzraSound i'm making a new question for you