轩辕小妖 发表于 2012-12-4 14:23:54

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

本帖最后由 轩辕小妖 于 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
      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

xx44t10 发表于 2012-12-4 15:25:20

我是酱油党  飘过

netegg 发表于 2012-12-4 15:33:26

本帖最后由 netegg 于 2012-12-4 15:35 编辑

只能给lz一个方向,看udf里clipboard关于format的函数,具体怎么操作,自己琢磨吧
但是有一点要说明,不是说剪贴板上的数据类型都可以贴出来,目标容器如果不支持,即使剪贴板上的数据是对的也没用

seniors 发表于 2012-12-5 15:35:17

_ClipBoard_SetDataEx

xms77 发表于 2012-12-6 19:37:02

_ClipBoard_Open(0)
        _ClipBoard_Empty()
        _ClipBoard_SetDataEx($hBitmap, $CF_BITMAP)
        _ClipBoard_Close()

annybaby 发表于 2012-12-6 19:41:09

回复 5# xms77


    这个是bmp格式的才可以吧??

afan 发表于 2012-12-7 11:18:06

回复 4# seniors


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

seniors 发表于 2012-12-7 12:16:36

我是从QR 制造者那个帖子中看到的
我没试过到底用什么图像句柄,还没研究

microzhou 发表于 2012-12-8 09:18:33

我也正被这个类似的问题困扰,还没找到解决方案,大家一起努力吧!

annybaby 发表于 2012-12-8 09:28:40

看来这问题解决起来不容易啊

afan 发表于 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
        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

seniors 发表于 2012-12-8 15:42:01

回复 11# afan
也就是一定要gdi格式的,不能用gdi+格式的

zldfsz 发表于 2012-12-8 19:38:18

标记一下,以后学习

happytc 发表于 2012-12-9 21:17:32

回复afan
也就是一定要gdi格式的,不能用gdi+格式的
seniors 发表于 2012-12-8 15:42 http://www.autoitx.com/images/common/back.gif

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

创建一个场境(DC),然后用强大的BitBlt函数SRCCOPY到剪切板上就可以了。

lxzan 发表于 2012-12-9 22:45:37

代码直接收下,谢谢.
页: [1] 2
查看完整版本: 如何将一个普通格式的图像文件放到剪贴板以便粘贴到QQ或者WORD窗口??[已解决]