cooska

前人种树,后人乘凉

导航

WM6下实现照相机自动拍照

Posted on 2011-03-20 15:55  cooska  阅读(348)  评论(0编辑  收藏  举报

我记得这个功能好像以前在某博客上看到过,忘了。现在要用的时候再去找突然又找不到相关的文章。。。。

现在自己把它实现了,记录下来,供以后有人需要的时候查看。

这个功能难度并不大,首先是打开照相机的拍摄对话框,这个在msdn的例子中就有。

然后就是关键,让程序模拟一个拍照的按键和回退按键来进行拍照和关闭返回。

先上我的代码吧:完整代码

界面部分就不上了,一个picturebox和两个button

Imports System.Runtime.InteropServices
Imports System.IO
Imports System.Drawing
Imports Microsoft.WindowsMobile.Forms
Imports System.Threading

Public Class Form1
    <DllImport("CoreDll")> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As IntPtr
    End Function

    <DllImport("CoreDll")> Public Shared Function GetForegroundWindow() As IntPtr
    End Function

    Dim ccd As CameraCaptureDialog
    Dim tmrCbk As TimerCallback
    Dim tmr As System.Threading.Timer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ccd = New CameraCaptureDialog
        ccd.Mode = CameraCaptureMode.Still
        ccd.Resolution = New Size(240, 180)
        Dim o As Object = New Object()
        tmrCbk = New TimerCallback(AddressOf GetPhoto)
        tmr = New System.Threading.Timer(tmrCbk , o, 6 * 1000, -1)
        If (ccd.ShowDialog() = DialogResult.OK) Then
            PictureBox1.Image = New Bitmap(ccd.FileName)
        End If
    End Sub

    Private Sub GetPhoto(ByVal state As Object)
        Dim hwnd As IntPtr = GetForegroundWindow()
        SendMessage(hwnd, &H312, &H5233, &HC20008)  '模拟拍照
        Dim o As Object = New Object()

        tmrCbk = New TimerCallback(AddressOf CloseCamera)
        tmr = New System.Threading.Timer(tmrCbk , o, 1 * 1000, -1)

    End Sub

    Private Sub CloseCamera(ByVal state As Object)
        Dim hwnd As IntPtr = GetForegroundWindow()
        SendMessage(hwnd, &H111, &H1B77, &H7C084600)  '模拟返回
        tmr.Dispose()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.Close()
        Me.Dispose()
    End Sub
End Class

这个例子我已经测试成功,可以直接拿去使用。

我讲解一下红色字体部分,因为它才是关键,呵呵,其他部分可以查阅相关资料,看msdn就行

SendMessage(hwnd, &H312, &H5233, &HC20008)
这个是我的相机拍照模拟代码

hwnd是获取窗口句柄,

&H312是发送拍照消息,

&H5233是wParam值,第一个消息参数,

&HC20008是lParam值,第二个消息参数

有的人会问这些数据是怎么来的,是否所有相机都统一用这几个参数。

我的回答是   这些数据并不适用于所有手机的相机模拟,我是从.net的一个工具remote spy来探测得到的

关于怎么使用remote spy我也做个示范吧

对于安装了wm6环境的电脑上,就有这个工具

首先要将手机与电脑连起来,至于怎么连就不做说明了。。。。

运行之后会提示选择一个设备,我用的是wm6的操作系统,所以选择了 windows mobile professional 6 device,点击OK,它就连接上你的手机并显示出一个窗口

将它展开,看看里面有没有 camera或者相机这样的字符。 卖个关子。。。就这样操作你是看不到的,呵呵,因为你还没打开相机呢。

启动手机上的相机,然后点击remote spy的刷新按钮,再展开看看

找到“相机”后,选择它,再点击上面的messages按钮,这个时候它就显示出了探测到的消息值。

试着按下拍照,看它会显示什么。

我这里就探测到了拍照的消息数据

但是不知道为什么它显示的名称是 Unknown,先不管了,直接要数据就行

这下大家都明白了吧~~  呵呵   

利用remote spy还能找到其他很多有用的消息值来,大家有兴趣可以自己去开发。

以上完全是自己的经验之谈,老鸟们请不要喷哈