  | 
				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 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |