我已经获得了 mediaplayer 播放窗口的hdc 接下来估计是取图像到内存操作,然后重画,这里怎么取图像?

解决方案 »

  1.   

    见鬼了!mediaplayer 播放窗口的hwnd是固定的,为什么用 getDC 得到的却会变化??
      

  2.   

    active movie control lib就不用那么麻烦,取HDC了
      

  3.   

    具体是哪一部?
    DC已经取得了吗?这时用CreateDIBSection创建DIBSection
    用CreateCompatibleDC创建DC
    用SelectObject将DIBSection选入DC
    将图像BitBlt
    根据CreateDIBSection时得到的地址对为图进行操作
    BitBlt回去
    选出DIBSection
    释放DIBSection、DC
      

  4.   

    CreateDIBSection VB声明 
    Declare Function CreateDIBSection Lib "gdi32" Alias "CreateDIBSection" (ByVal hDC As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long 
    说明 
    创建一个DIBSection。这是一个GDI对象,可象一幅与设备有关位图那样使用。但是,它在内部作为一幅与设备无关位图保存 
    返回值 
    Long,执行成功返回DIBSection位图的句柄,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hDC Long,一个设备场景的句柄。如dw设为DIB_PAL_COLORS,那么DIB颜色表就会用来自逻辑调色板的颜色进行初始化 
    pBitmapInfo BITMAPINFO,这个结构初始化成欲创建的那幅位图的配置数据 
    un Long,下述常数之一: 
    DIB_PAL_COLORS BITMAPINFO包含了一个16位调色板索引的数组 
    DIB_RGB_COLORS BITMAPINFO包含了一个颜色表,其中保存有32位颜色(RGBQUAD) 
    lplpVoid Long,用于载入DIBSection数据区的内存地址 
    handle Long,指向一个文件映射对象的可选句柄,位图将在其中创建。如设为零,Windows会自动分配内存 
    dw Long,如指定了句柄,就用这个参数指定位图数据在文件映射对象中的偏移量 
    注解 
    一旦不再需要,记住用DeleteObject函数删除DIBSection位图
    如Windows分配了一个内存缓冲区,那么对象删除以后,缓冲区也会自动删除。如指定了一个文件映射对象,则不会自动将其清除
    在直接访问DIB内存之前,首先必须保证Windows已完成了绘图(记住,Windows可能对绘图操作进行了排列处理)。通过调用gdiFlush函数,可确保完成所有未决的绘图操作
     
      

  5.   

    zyl910 :你总算出现拉,大忙人!我现在的问题是 DC 取不对!很奇怪的,我用 spy++ 察看了那个窗口的内容,窗口类是 VideoRenderer ,窗口的caption 是 ActiveMovie Window我就用 hhwnd = FindWindow(vbNullString, "ActiveMovie Window")得到了该窗口的句柄问题在下面:         hhdc = GetDC(hhwnd)
    这里得到的 DC 居然每次都不一样。就是对于相同的hhwnd返回的hhdc值不同想用  GetPixel 取像素值,结果返回总是 -1怎么办??搞不下去了我看了一下 mediaplayer 7.0 ,它本身有视频调节的功能的,但是不知道怎么调用,msdn 里没有介绍又下载了 mediaplayer 7.0 的sdk ,7M 多阿!!居然全是垃圾!!甚至向微软的程序员打听了,居然也不知道晕阿
      

  6.   

    还有,返回的 hhwnd 居然和 spy++ 里面显示的不同??难道我 hhwnd = FindWindow(vbNullString, "ActiveMovie Window") 得到的句柄不对??
      

  7.   

    如果用 hhwnd = FindWindow("VideoRenderer", vbNullString) 居然还得不到句柄,返回是 0
      

  8.   

    我这里的Media Player 9.0的类名是“WMPlayerApp”用GetDC取得的DC本来就是动态分配的
      

  9.   

    鬼了我是 7.0 的怎么差那么多,有没有 caption 的??对了,你有没有 msn ?这里太慢
      

  10.   

    “根据CreateDIBSection时得到的地址对为图进行操作”这一步,改变亮度应该怎么操作?
      

  11.   

    关注
    我也正在做一个这样的程序,但不用VB自带的多媒体控件,是用操作系统自带的一个类,这样就可以更低层的控制,像窗口问题根本就不是问题,几乎豪杰能做到的我也做到了。但就是还有两点:改变亮度做不到;音效处理也做不到。
    如果有意交流请EMAIL:
    [email protected]
      

  12.   

    http://expert.csdn.net/Expert/topic/770/770501.xml?temp=.4838678
      

  13.   

    真是火大!请看代码:'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub CtrlDC(ByVal MyDC As Long)
    ''用CreateDIBSection创建DIBSection
    ''用CreateCompatibleDC创建DC
    ''用SelectObject将DIBSection选入DC
    ''将图像BitBlt
    ''根据CreateDIBSection时得到的地址对为图进行操作
    ''BitBlt回去
    ''选出DIBSection
    ''释放DIBSection、DC
        'Exit Sub
        '-> Compile this code for better performance
        Dim bi24BitInfo As BITMAPINFO, bBytes() As Byte, Cnt As Long
        With bi24BitInfo.bmiHeader
            .biBitCount = 24                            '''每像素 3 字节
            .biCompression = BI_RGB                     '''未压缩的格式
            .biPlanes = 1
            .biSize = Len(bi24BitInfo.bmiHeader)
            .biWidth = 352
            .biHeight = 288
        End With
        
        ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
        
        iDC = CreateCompatibleDC(0)
        iBitmap = CreateDIBSection(iDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&)
        SelectObject iDC, iBitmap
        mm = BitBlt(iDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, MyDC, 0, 0, vbSrcCopy)
        GetDIBits iDC, iBitmap, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
        For Cnt = LBound(bBytes) To UBound(bBytes)
            If bBytes(Cnt) < 100 Then
                bBytes(Cnt) = 0
            Else
                bBytes(Cnt) = bBytes(Cnt) - 100
            End If
        Next Cnt
        SetDIBitsToDevice MyDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
        DeleteDC iDC
        DeleteObject iBitmap
    End Sub'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以上是我用来改变mediaplayer.pause 时画面亮度的代码,不起作用。调试后发现 BitBlt 函数运行成功,但是copy到的只是一副黑色的位图!是不是 mediaplayer 显示图像是用的 overlay 方式? 用BitBlt无法正常 copy ??
      

  14.   

    真是火大!请看代码:'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub CtrlDC(ByVal MyDC As Long)
    ''用CreateDIBSection创建DIBSection
    ''用CreateCompatibleDC创建DC
    ''用SelectObject将DIBSection选入DC
    ''将图像BitBlt
    ''根据CreateDIBSection时得到的地址对为图进行操作
    ''BitBlt回去
    ''选出DIBSection
    ''释放DIBSection、DC
        'Exit Sub
        '-> Compile this code for better performance
        Dim bi24BitInfo As BITMAPINFO, bBytes() As Byte, Cnt As Long
        With bi24BitInfo.bmiHeader
            .biBitCount = 24                            '''每像素 3 字节
            .biCompression = BI_RGB                     '''未压缩的格式
            .biPlanes = 1
            .biSize = Len(bi24BitInfo.bmiHeader)
            .biWidth = 352
            .biHeight = 288
        End With
        
        ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
        
        iDC = CreateCompatibleDC(0)
        iBitmap = CreateDIBSection(iDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&)
        SelectObject iDC, iBitmap
        mm = BitBlt(iDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, MyDC, 0, 0, vbSrcCopy)
        GetDIBits iDC, iBitmap, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
        For Cnt = LBound(bBytes) To UBound(bBytes)
            If bBytes(Cnt) < 100 Then
                bBytes(Cnt) = 0
            Else
                bBytes(Cnt) = bBytes(Cnt) - 100
            End If
        Next Cnt
        SetDIBitsToDevice MyDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
        DeleteDC iDC
        DeleteObject iBitmap
    End Sub'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以上是我用来改变mediaplayer.pause 时画面亮度的代码,不起作用。调试后发现 BitBlt 函数运行成功,但是copy到的只是一副黑色的位图!是不是 mediaplayer 显示图像是用的 overlay 方式? 用BitBlt无法正常 copy ??