 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
mp484
註冊時間: 2006-08-08 文章: 84
第 1 樓
|
發表於: 星期一 五月 11, 2009 7:58 pm 文章主題: 是否有人使用過VFP做「二維條碼」的解碼? |
|
|
如題,目前商業上的應用為在QuickMark的網站上有API在VB的應用,但沒有VFP的解碼程式,是否有人能夠修改下列的程式碼?提供大家交流!
Visual Basic Top
範例路徑: \API_Example\WindowsMobile\msgapi_VB_source.rar
步驟1:引用
新視窗
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Imports Microsoft.Win32
Imports System.IO
Imports Microsoft.WindowsCE.Forms //加入參考Microsoft.WindowCE.Forms
步驟2:QuickMark使用WM_COPYDATA來傳送與接收訊息,因此利用RegisterWindowMessage方法註冊 QuickMarkMessengerAPIApplication訊息。
新視窗
Private RM_QuickMarkMessengerAPIApp As UInt32 = 0 //全域變數
...
Me.RM_QuickMarkMessengerAPIApp = RegisterWindowMessage("QuickMarkMessengerAPIApplication")
步驟3:啟動QuickMark程式進行辨識。
新視窗
Private Sub LaunchQuickMark()
'1):至登錄檔讀取QuickMark執行檔位置。
'----------------------------------------------
'Path:[HKEY_CURRENT_USER]\Software\QuickMark
'Key:QuickMarkAppPath
'Value:String
'----------------------------------------------
Dim szQuickMarkApp As String = ""
Dim QuickMarkKey As RegistryKey = Registry.CurrentUser
QuickMarkKey = QuickMarkKey.OpenSubKey("Software\QuickMark", False)
szQuickMarkApp = QuickMarkKey.GetValue("QuickMarkAppPath").ToString()
QuickMarkKey.Close()
'2):假如登錄檔資訊無法取得,設為預設路徑 \Program Files\QuickMark\QuickMark.exe
If szQuickMarkApp.Length = 0 Then
szQuickMarkApp = "\Program Files\QuickMark\QuickMark.exe"
End If
'3):啟動QuickMark
If File.Exists(szQuickMarkApp) Then
'Launch application
Dim P As New Process()
P.StartInfo.FileName = szQuickMarkApp
P.StartInfo.Verb = "Open"
P.Start()
P.WaitForExit(1000)
'wait 1 second
'4):傳送 RM_QuickMarkMessengerAPIApp 至所有上層的視窗。
'----------------------------------------------
'參數說明:
'HWND hWnd : HWND_BROADCAST ,發送消息至系統中所有上層視窗
'UINT Msg : 與QuickMark應用程式溝通的訊息id
'WPARAM wParam : 要接收結果的視窗
'LPARAM lParam : QuickMark應用程式開啟時,預設掃描的類型。(1: 一維條碼 2: 二維條碼)
'----------------------------------------------
Dim DefaultBarcodeType As Integer
DefaultBarcodeType = 2 '預設為二維條碼
PostMessageW(HWND_BROADCAST, RM_QuickMarkMessengerAPIApp, messageWindow.Hwnd, DefaultBarcodeType)
Else
MessageBox.Show("QuickMark not found!")
End If
End Sub
步驟4:接收QuickMark回傳結果。
新視窗
Private messageWindow As MyMessageWindow //宣告
...
Me.messageWindow = New MyMessageWindow()
...
...
'MyMessageWindow 類別實作
Friend Class MyMessageWindow
Inherits MessageWindow
Private Const WM_COPYDATA As Integer = 74
'----------------------------------------------
'STRUCT COPYDATASTRUCT member
'dwData: 未使用
'lpData: 回傳資料的指標,資料字串以Unicode編碼
'cbData: lpData的資料長度 (單位: bytes)
'----------------------------------------------
Public Structure COPYDATASTRUCT
Public dwData As Integer
Public cbData As Integer
Public lpData As IntPtr
End Structure
Protected Overloads Overrides Sub WndProc(ByRef msg As Message)
Select Case msg.Msg
Case WM_COPYDATA
'接收回傳結果
Dim str As String = GetMsgString(msg.LParam)
'TODO:Add your code here to process with the str.
MessageBox.Show(str, "Result")
Exit Select
End Select
MyBase.WndProc(msg)
End Sub
Public Shared Function GetMsgString(ByVal lParam As IntPtr) As String
'取得回傳結果字串
If lParam <> IntPtr.Zero Then
Dim st As COPYDATASTRUCT = DirectCast(Marshal.PtrToStructure(lParam, GetType(COPYDATASTRUCT)), COPYDATASTRUCT)
Dim str As String = Marshal.PtrToStringUni(st.lpData)
Return str
Else
Return Nothing
End If
End Function
End Class |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|