本帖最后由 www8899 于 2023-3-28 23:39 编辑
感谢有你,谢谢!我IP写死是不得已,实际 IP是客户机连接服务端后显示在$idListview里,当右键执行远程控制时,读取所选择索引的ip执行tvnviewer.exe$IP命令
实际代码:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <StructureConstants.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <array.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <GuiListView.au3>
Global $TightVNC
$MHT = GUICreate("", 1004, 630)
$Group1 = GUICtrlCreateGroup("客户端信息", 700, 313, 298, 286)
GUICtrlSetFont(-1, 8.5, 400, 1, "微软雅黑")
Local $TCPPort = 8411
$TCPIP = @IPAddress1
Local $TCPPort = 8411
Local $_TCP_HSOCKETS[1][10], $Recvone = 0, $delSocket = -1, $ConnectedSocket, $RecvTcp = 0
Local $TCPRecvMode, $postsk, $MainStr = "####", $recvBtoS, $recvOld, $error
Local $MainSocket = TCPListen($TCPIP, $TCPPort)
Local $ListView3 = GUICtrlCreateListView("", 710, 330, 278, 258, -1, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT)
_GUICtrlListView_SetTextBkColor($ListView3, 0x5BF94A)
_GUICtrlListView_AddColumn($ListView3, "", 0)
_GUICtrlListView_AddColumn($ListView3, "Socket", 0)
_GUICtrlListView_AddColumn($ListView3, "客户端名称", 135, 2)
_GUICtrlListView_AddColumn($ListView3, "客户端IP地址", 135, 2)
GUICtrlSetTip(-1, "右键菜单:远程控制")
GUICtrlSetFont(-1, 11, 400, 1, "微软雅黑")
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
TCPStartup()
;~ Local $MainSocket = TCPListen(IniRead(@ScriptDir & "\wim\JYDN\LAN.ini", "lan", "TCPIP ", ""), $TCPPort)
While 1
_TCPRecv()
_While()
WEnd
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom
$hWndFrom = $ilParam
Switch $iwParam
Case $TightVNC
Local $ipRead = GUICtrlRead($ListView3, 0)
Run(@ComSpec & ' /c ' & @ScriptDir &'\tvnviewer.exe' &' ' & $ipRead, @ScriptDir, @SW_HIDE)
EndSwitch
EndFunc ;==>WM_COMMAND
Func WM_CONTEXTMENU($hWnd, $iMsg, $iwParam, $ilParam)
Local $hMenu
$hMenu = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu, 0, "连接", $TightVNC)
_GUICtrlMenu_TrackPopupMenu($hMenu, $hWnd)
_GUICtrlMenu_DestroyMenu($hMenu)
Return True
EndFunc ;==>WM_CONTEXTMENU
Func _While()
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Quit()
EndSwitch
EndFunc ;==>_While
Func Quit()
TCPShutdown()
Exit
EndFunc ;==>Quit
Func _TCPRecv()
Local $RegSocket = -1, $RegIp, $rDays
Dim $RegSocket = TCPAccept($MainSocket)
If $RegSocket <> -1 Then
Dim $recv_1 = TCPRecv($RegSocket, 1024 * 1024, 1)
If @error Then
$error = Int(@error)
EndIf
If $recv_1 <> "" Then
$checkData = StringLeft($recv_1, 12)
If $checkData = "0x232323232B" Then
$RegIp = SocketToIP($RegSocket)
$recvBtoS = BinaryToString($recv_1, 4)
$rDays = StringSplit($recvBtoS, "+", 1)
If IsArray($rDays) Then
If UBound($rDays) > 3 Then
If StringUpper($rDays[4]) = StringUpper("SendName") Then
_SocketAct($RegSocket, $RegIp, $rDays[5], "SendName")
Dim $ONLINEPclist = ""
For $i = 1 To UBound($_TCP_HSOCKETS) - 1
$ONLINEPclist = $ONLINEPclist & $_TCP_HSOCKETS[$i][0] & "|" & $_TCP_HSOCKETS[$i][2] & ","
Next
EndIf
EndIf
EndIf
EndIf
EndIf
Else
If (UBound($_TCP_HSOCKETS)) > 1 Then
For $i = 1 To UBound($_TCP_HSOCKETS) - 1
Dim $recv_1 = TCPRecv($_TCP_HSOCKETS[$i][0], 1024 * 1024, 1)
If @error Then
$error = Int(@error)
If $error = 10054 Then
If $_TCP_HSOCKETS[$i][0] <> -1 Then
$delSocket = $_TCP_HSOCKETS[$i][0]
TCPCloseSocket($_TCP_HSOCKETS[$i][0])
EndIf
EndIf
EndIf
If $recv_1 <> "" Then
$postsk = $_TCP_HSOCKETS[$i][0]
EndIf
Next
If $delSocket <> -1 Then
_TCP_Server_Broadcast($delSocket, "offline")
EndIf
EndIf
EndIf
EndFunc ;==>_TCPRecv
Func _SocketAct($Socketid = -1, $Socketip = "", $SocketName = "", $mode = "add")
If $Socketid <> -1 And $Socketip <> "" And $SocketName <> "" Then
Dim $name_and_ip = $SocketName & "|" & $Socketip
Dim $so_name_and_ip = _ArrayFindAll($_TCP_HSOCKETS, $Socketid, 0, 0, 0, 0, 0)
If IsArray($so_name_and_ip) Then
TCPCloseSocket($_TCP_HSOCKETS[$so_name_and_ip[0]][0])
$_TCP_HSOCKETS[$so_name_and_ip[0]][0] = $Socketid
$_TCP_HSOCKETS[$so_name_and_ip[0]][3] = 1
Assign("GSocket" & $Socketid, $so_name_and_ip[0], 2)
_TCP_Server_Broadcast($Socketid, "ONLINE")
Else
Dim $RecvUBound = UBound($_TCP_HSOCKETS)
ReDim $_TCP_HSOCKETS[$RecvUBound + 1][10]
$_TCP_HSOCKETS[$RecvUBound][0] = $Socketid
$_TCP_HSOCKETS[$RecvUBound][1] = $Socketip
$_TCP_HSOCKETS[$RecvUBound][2] = $name_and_ip
$_TCP_HSOCKETS[$RecvUBound][3] = 1
Assign("GSocket" & $Socketid, $RecvUBound, 2)
_TCP_Server_Broadcast($Socketid, "ONLINE")
EndIf
EndIf
EndFunc ;==>_SocketAct
Func _TCP_Server_Broadcast($sText = "", $SendType = "Msg")
If StringUpper($SendType) = StringUpper("ONLINE") Or StringUpper($SendType) = StringUpper("offline") Then
Dim $sTextA = $_TCP_HSOCKETS[Eval("GSocket" & $sText)][0] & "|" & $_TCP_HSOCKETS[Eval("GSocket" & $sText)][2]
_Clientline($sTextA, $SendType)
Else
Dim $sTextA = $sText
EndIf
If (UBound($_TCP_HSOCKETS)) > 1 Then
Dim $sendmsg = StringToBinary($MainStr & "++0+" & $SendType & "+" & $sTextA & ",+", 4)
For $i = 1 To UBound($_TCP_HSOCKETS) - 1
If StringUpper($SendType) = StringUpper("ONLINE") Or StringUpper($SendType) = StringUpper("offline") Then
If UBound($_TCP_HSOCKETS) > $i Then
If $_TCP_HSOCKETS[$i][0] And $_TCP_HSOCKETS[$i][0] <> $sText Then
TCPSend($_TCP_HSOCKETS[$i][0], $sendmsg)
If @error Then
$error = Int(@error)
If $_TCP_HSOCKETS[$i][0] <> -1 Then
$delSocket = $_TCP_HSOCKETS[$i][0]
TCPCloseSocket($_TCP_HSOCKETS[$i][0])
EndIf
If $delSocket <> -1 Then
_TCP_Server_Broadcast($delSocket, "offline")
EndIf
EndIf
EndIf
EndIf
Else
If $_TCP_HSOCKETS[$i][0] Then
TCPSend($_TCP_HSOCKETS[$i][0], $sendmsg)
If @error Then
$error = Int(@error)
If $_TCP_HSOCKETS[$i][0] <> -1 Then
$delSocket = $_TCP_HSOCKETS[$i][0]
TCPCloseSocket($_TCP_HSOCKETS[$i][0])
If $delSocket <> -1 Then
_TCP_Server_Broadcast($delSocket, "offline")
EndIf
EndIf
EndIf
EndIf
EndIf
Next
If $delSocket <> -1 Then
_ArrayDelete($_TCP_HSOCKETS, Eval("GSocket" & $delSocket))
Assign("GSocket" & $delSocket, -1, 2)
$delSocket = -1
EndIf
EndIf
EndFunc ;==>_TCP_Server_Broadcast
Func _Clientline($sONLINEIPStr = "", $sONLINEMode = "")
If $sONLINEIPStr <> "" Then
Dim $sONLINESp = StringSplit($sONLINEIPStr, "|", 1)
If IsArray($sONLINESp) Then
If UBound($sONLINESp) > 3 Then
Dim $sONLINESocket = $sONLINESp[1]
Dim $sONLINEname = $sONLINESp[2]
Dim $sONLINEIP = $sONLINESp[3]
Dim $GetItemCount = _GUICtrlListView_GetItemCount($ListView3)
Dim $sONLINE_ID = _GUICtrlListView_FindInText($ListView3, $sONLINEname & "|" & $sONLINEIP)
If $sONLINE_ID <> -1 Then
If StringUpper($sONLINEMode) = StringUpper("offline") Then
TrayTip('通知', " " & $sONLINEIPStr & '已断开', 1, 1)
_GUICtrlListView_DeleteItem(GUICtrlGetHandle($ListView3), $sONLINE_ID)
Else
TrayTip('通知', " " & $sONLINEname & "已连接.", 1, 1)
_GUICtrlListView_SetItem($ListView3, $sONLINESocket, $sONLINE_ID, 1)
EndIf
Else
If StringUpper($sONLINEMode) = StringUpper("ONLINE") Then
TrayTip('通知', " " & $sONLINEname & "已连接.", 1, 1)
_GUICtrlListView_AddItem($ListView3, $sONLINEname & "|" & $sONLINEIP, $GetItemCount)
_GUICtrlListView_AddSubItem($ListView3, $GetItemCount, $sONLINESocket, 1, 1)
_GUICtrlListView_AddSubItem($ListView3, $GetItemCount, $sONLINEname, 2, 1)
_GUICtrlListView_AddSubItem($ListView3, $GetItemCount, $sONLINEIP, 3, 1)
EndIf
EndIf
EndIf
EndIf
EndIf
EndFunc ;==>_Clientline
Func SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
Return $aRet
EndFunc ;==>SocketToIP
|