gto250 发表于 2009-7-6 23:15:36

关于从内存中载入图片的问题

本帖最后由 gto250 于 2009-7-12 07:06 编辑

公司连入外网的服务器现在由我负责,但是常常有人到那台机子上玩,而我的办公地点是在另一条街道的,现在打算自己做个屏幕监控的小程序,只是看看有没有人在那里玩。现在遇到的问题就是当我截取服务器上的屏幕图片之后,通过tcp传输到我的电脑上,如何能直接从内存中载入图片显示出来,而不是保存了以后再载入显示。
请各位兄弟援手相助




http://lwc.nhome.cn/code/showip.asp

kn007 发表于 2009-7-6 23:23:37

很有难度啊

rolaka 发表于 2009-7-7 11:13:55

哦 可以 不过要先把图片序列化 然后就可以直接当字符串传送了

我的办法是 在管理机上架设http, php写服务端 autoit作为客户端...

http://www.autoitx.com/forum.php?mod=viewthread&tid=7223

php部分么 知道怎么用$_POST或者$_GET就ok了

caodongchun 发表于 2009-7-8 16:05:06

花生壳,远程监控

gto250 发表于 2009-7-8 18:49:05

如果用其他软件的话,我的问题也就失去了意义了

ceoguang 发表于 2009-7-9 01:39:39

参考http://www.autoitscript.com/forum/index.php?showtopic=64388

caodongchun 发表于 2009-7-9 16:55:40

本帖最后由 caodongchun 于 2009-7-9 16:57 编辑

#include 'ScreenCapture.au3'

$tempfile = _TempFile()
_ScreenCapture_Capture($tempfile)
$file = FileOpen($tempfile, 16)
$str = FileRead($file)
FileClose($file)
FileDelete($tempfile)

Func _TempFile($s_DirectoryName = @TempDir, $s_FilePrefix = "~", $s_FileExtension = ".tmp", $i_RandomLength = 7)
        Local $s_TempName
        ; Check parameters
        If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @TempDir ; First reset to default temp dir
        If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @ScriptDir ; Still wrong then set to Scriptdir
        ; add trailing \ for directory name
        If StringRight($s_DirectoryName, 1) <> "\" Then $s_DirectoryName = $s_DirectoryName & "\"
        ;
        Do
                $s_TempName = ""
                While StringLen($s_TempName) < $i_RandomLength
                        $s_TempName = $s_TempName & Chr(Random(97, 122, 1))
                WEnd
                $s_TempName = $s_DirectoryName & $s_FilePrefix & $s_TempName & $s_FileExtension
        Until Not FileExists($s_TempName)

        Return ($s_TempName)
EndFunc   ;==>_TempFile

'ScreenCapture.au3'中165行下加一行:
If $sExt='tmp' Then $sExt='jpg'

这个方法比较简单,也相对隐蔽

caodongchun 发表于 2009-7-10 15:30:01

如果你坚决不打算生成文件的话,可以参考官方的一个案例:
http://www.autoitscript.com/forum/index.php?showtopic=96236&st=0&p=691853&hl=_GDIPlus_BitmapLockBits&fromsearch=1&
要对GDI+有个更深入的了解了

lynfr8 发表于 2009-7-10 16:28:40

这个比较有研究价值,大家继续深入讨论下

caodongchun 发表于 2009-7-11 16:09:59

用GDI+其实没什么意义,使用tmp文件还是比较具有稳定性的,从建立文件到读出字符串直至删除文件用不了一秒钟,且文件生成在temp文件夹内,代码实现也相当之简单!
先给你一个发送端的例子:

;修改UDF函数16行:Global $giJPGQuality = 10
;UDF 165行下加一行:If $sExt='tmp' Then $sExt='jpg'

#include 'ScreenCapture.au3'
UDPStartup()
While 1
$socket = UDPOpen("192.160.0.101", 65532)
If @error<>0 Then
        Sleep(200)
Else
        ExitLoop
EndIf
WEnd
AdlibEnable('sct',30000)


Func sct()
        $tempfile = _TempFile()
        _ScreenCapture_Capture($tempfile)
        $file = FileOpen($tempfile, 16)
        $str = FileRead($file)
        FileClose($file)
        FileDelete($tempfile)
        $status = UDPSend($socket, $str)

EndFunc   ;==>sct


While 1
        Sleep(100)
WEnd


Func _TempFile($s_DirectoryName = @TempDir, $s_FilePrefix = "~", $s_FileExtension = ".tmp", $i_RandomLength = 7)
        Local $s_TempName
        ; Check parameters
        If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @TempDir ; First reset to default temp dir
        If Not FileExists($s_DirectoryName) Then $s_DirectoryName = @ScriptDir ; Still wrong then set to Scriptdir
        ; add trailing \ for directory name
        If StringRight($s_DirectoryName, 1) <> "\" Then $s_DirectoryName = $s_DirectoryName & "\"
        ;
        Do
                $s_TempName = ""
                While StringLen($s_TempName) < $i_RandomLength
                        $s_TempName = $s_TempName & Chr(Random(97, 122, 1))
                WEnd
                $s_TempName = $s_DirectoryName & $s_FilePrefix & $s_TempName & $s_FileExtension
        Until Not FileExists($s_TempName)

        Return ($s_TempName)
EndFunc   ;==>_TempFile

caodongchun 发表于 2009-7-11 16:13:04

接下来是接收端了:

UDPStartup()

While 1
        $socket = UDPBind("192.160.0.101", 65532)
        If @error <> 0 Then
                Sleep(200)
        Else
                ExitLoop
        EndIf
WEnd
While 1
    $data = UDPRecv($socket, 90000)
    If $data <> "" Then
       $file=FileOpen('2.jpg',18)
           FileWrite($file,$data)
           FileClose($file)
    EndIf
    sleep(1000)
WEnd


其实你还可以想一想通过接收端发送请求的方式让发送端发送信息

caodongchun 发表于 2009-7-11 16:27:31

本帖最后由 caodongchun 于 2009-7-11 16:56 编辑

上述请求方式的案例如附件,包含了修改过的UDF
注意:上述说的修改Global $giJPGQuality = 10是改变了画质的品质,我看这个品质是可以接受的,究竟是用来监控而不是作图,较小的文件传输速度也会加快,并较安全!
如果再修改成由send方首先发ip到rev方的话,就更有有点像木马的感觉了:(

caodongchun 发表于 2009-7-11 18:52:29

我看类似这种东西应该直接给你的领导。哈哈,完善中吧:)

tisiem 发表于 2009-7-12 15:20:01

呵,这是个很牛的应用!

caodongchun 发表于 2009-7-12 16:37:10

基本算是写完了,如果网管可以封装ghost版的影子系统,一般来讲就不会有任何问题了!
http://www.autoitx.com/forum.php?mod=viewthread&tid=8298
页: [1] 2
查看完整版本: 关于从内存中载入图片的问题