找回密码
 加入
搜索
查看: 13012|回复: 15

[系统综合] 如何将一个普通格式的图像文件放到剪贴板以便粘贴到QQ或者WORD窗口??[已解决]

 火.. [复制链接]
发表于 2012-12-4 14:23:54 | 显示全部楼层 |阅读模式
本帖最后由 轩辕小妖 于 2012-12-11 13:15 编辑

最近的天气冷了好多,就像坛子的气氛一样~~
所以准备多多向大家请教`~
坛子可以找到将屏幕截图或者位图文件放到剪贴板以便粘贴的帖子,但没有找到如jpg,png或者是gif等格式的,而Bmp一般又比较大,所以希望可以找到方法,谢谢大家关注及回复 ~~



A大帮助解决了,代码如下(见#7):
#Include <GDIPlus.au3>


_SetClipboardPic('1.jpg')

Run('mspaint.exe')
WinWaitActive('未命名')
send('^v')

Func _SetClipboardPic($PicFile)
         _GDIPlus_Startup()
        Local $hBitmap = _GDIPlus_BitmapCreateFromFile($PicFile)
        Local $hImage = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        Local $aRet = DllCall('user32.dll', 'ptr', 'CopyImage', 'ptr', $hImage, 'int', 0, 'int', 0, 'int', 0, 'int', 0x8 + 0x4)
        Local $hBitmapCopy =  $aRet[0]
        DllCall('user32.dll', 'bool', 'OpenClipboard', 'hwnd', 0)
        DllCall('user32.dll', 'bool', 'EmptyClipboard')
        DllCall('user32.dll', 'handle', 'SetClipboardData', 'uint', 2, 'handle', $hBitmapCopy)
        DllCall('user32.dll', 'bool', 'CloseClipboard')
        _WinAPI_DeleteObject($hBitmapCopy)
        _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_ShutDown ()
EndFunc   ;==>_SetClipboardPic
发表于 2012-12-4 15:25:20 | 显示全部楼层
我是酱油党  飘过
发表于 2012-12-4 15:33:26 | 显示全部楼层
本帖最后由 netegg 于 2012-12-4 15:35 编辑

只能给lz一个方向,看udf里clipboard关于format的函数,具体怎么操作,自己琢磨吧
但是有一点要说明,不是说剪贴板上的数据类型都可以贴出来,目标容器如果不支持,即使剪贴板上的数据是对的也没用
发表于 2012-12-5 15:35:17 | 显示全部楼层
_ClipBoard_SetDataEx
发表于 2012-12-6 19:37:02 | 显示全部楼层
_ClipBoard_Open(0)
        _ClipBoard_Empty()
        _ClipBoard_SetDataEx($hBitmap, $CF_BITMAP)
        _ClipBoard_Close()
发表于 2012-12-6 19:41:09 | 显示全部楼层
回复 5# xms77


    这个是bmp格式的才可以吧??
发表于 2012-12-7 11:18:06 | 显示全部楼层
回复 4# seniors


    _ClipBoard_SetDataEx 需要的 $hBitmap 参数好像不是普通的 位图图像句柄,试过
_GDIPlus_BitmapCreateFromHBITMAP
_GDIPlus_BitmapCreateHBITMAPFromBitmap
都不行……
比较笨的方法就是先转成BMP格式临时文件,_ClipBoard_SetDataEx 之后再删除临时BMP文件。

评分

参与人数 1金钱 +10 收起 理由
轩辕小妖 + 10 感谢帮助,意思意思~~

查看全部评分

发表于 2012-12-7 12:16:36 | 显示全部楼层
我是从QR 制造者那个帖子中看到的
我没试过到底用什么图像句柄,还没研究

评分

参与人数 1金钱 +10 收起 理由
轩辕小妖 + 10 感谢帮助,意思意思~~

查看全部评分

发表于 2012-12-8 09:18:33 | 显示全部楼层
我也正被这个类似的问题困扰,还没找到解决方案,大家一起努力吧!
发表于 2012-12-8 09:28:40 | 显示全部楼层
看来这问题解决起来不容易啊
发表于 2012-12-8 14:17:58 | 显示全部楼层
回复 8# seniors


    谢谢提醒,原来还需要 CopyImage
#Include <GDIPlus.au3>


_SetClipboardPic('1.jpg')

Run('mspaint.exe')
WinWaitActive('未命名')
send('^v')

Func _SetClipboardPic($PicFile)
         _GDIPlus_Startup()
        Local $hBitmap = _GDIPlus_BitmapCreateFromFile($PicFile)
        Local $hImage = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        Local $aRet = DllCall('user32.dll', 'ptr', 'CopyImage', 'ptr', $hImage, 'int', 0, 'int', 0, 'int', 0, 'int', 0x8 + 0x4)
        Local $hBitmapCopy =  $aRet[0]
        DllCall('user32.dll', 'bool', 'OpenClipboard', 'hwnd', 0)
        DllCall('user32.dll', 'bool', 'EmptyClipboard')
        DllCall('user32.dll', 'handle', 'SetClipboardData', 'uint', 2, 'handle', $hBitmapCopy)
        DllCall('user32.dll', 'bool', 'CloseClipboard')
        _WinAPI_DeleteObject($hBitmapCopy)
        _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_ShutDown ()
EndFunc   ;==>_SetClipboardPic

评分

参与人数 2金钱 +40 贡献 +2 收起 理由
xms77 + 30 + 2 学习了~
轩辕小妖 + 10 感谢帮助,意思意思~~

查看全部评分

发表于 2012-12-8 15:42:01 | 显示全部楼层
回复 11# afan
也就是一定要gdi格式的,不能用gdi+格式的

评分

参与人数 1金钱 +10 收起 理由
轩辕小妖 + 10 大师,几时出个GDI+系列教程啊

查看全部评分

发表于 2012-12-8 19:38:18 | 显示全部楼层
标记一下,以后学习
发表于 2012-12-9 21:17:32 | 显示全部楼层
回复  afan
也就是一定要gdi格式的,不能用gdi+格式的
seniors 发表于 2012-12-8 15:42


用gdi+当然可以了,其实核心就是如何把GDIP+的HBITMAP转换成剪切板能认识的GDI32-BITMAP而已。

创建一个场境(DC),然后用强大的BitBlt函数SRCCOPY到剪切板上就可以了。
发表于 2012-12-9 22:45:37 | 显示全部楼层
代码直接收下,谢谢.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-1 12:02 , Processed in 0.077423 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表