我记得这个功能好像以前在某博客上看到过,忘了。现在要用的时候再去找突然又找不到相关的文章。。。。
现在自己把它实现了,记录下来,供以后有人需要的时候查看。
这个功能难度并不大,首先是打开照相机的拍摄对话框,这个在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还能找到其他很多有用的消息值来,大家有兴趣可以自己去开发。
以上完全是自己的经验之谈,老鸟们请不要喷哈