台灣最大程式設計社群網站
線上人數
1244
 
會員總數:246101
討論主題:189673
歡迎您免費加入會員
討論區列表 >> Windows Phone APP >> windows mobile 使用vs2008(c#) 程式回傳值
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
windows mobile 使用vs2008(c#) 程式回傳值
價值 : 150 QP  點閱數:4002 回應數:3
樓主

wen
門外漢
0 8
178 42
發送站內信

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
// QuickMark
using System.Diagnostics;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.IO;
using Microsoft.WindowsCE.Forms;
using Microsoft.WindowsMobile.PocketOutlook;


namespace msgapi
{

public partial class msgapi : Form
{

[DllImport("coredll.dll")]
private static extern uint RegisterWindowMessage(string lpString);

[DllImport("coredll.dll")]
public static extern int PostMessageW(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

internal static readonly IntPtr HWND_BROADCAST = new IntPtr(0xFFFF);

//a unique message for inter-application communication
private UInt32 RM_QuickMarkMessengerAPIApp = 0;



//Handle to the window whose window procedure will receive the decoded result.
private MyMessageWindow messageWindow;

public OutlookSession MyOulooksession;
//public 關鍵字是型別和型別成員的存取修飾詞。public是最寬鬆的存取層級。
public Appointment MyAppointment;
//public 關鍵字是型別和型別成員的存取修飾詞。public是最寬鬆的存取層級。

Microsoft.WindowsCE.Forms.Message msg;

public msgapi()
{
InitializeComponent();

//Register a window message for inter-application communication
this.RM_QuickMarkMessengerAPIApp = RegisterWindowMessage("QuickMarkMessengerAPIApplication");

this.messageWindow = new MyMessageWindow();


//OutlookSession MyOutlooksession = new OutlookSession();
//this.MyOulooksession = new OutlookSession();
}

private void menuItemOK_Click(object sender, EventArgs e)
{
// LaunchQuickMark();
//按下ok後執行副程式
try
{
LaunchQuickMark();
}
catch (Exception ex)
{
MessageBox.Show("ERR!");
}
}

private void LaunchQuickMark()
{
//Step 1:至登錄檔讀取QuickMark執行檔位置。

String szQuickMarkApp = "";
RegistryKey QuickMarkKey = Registry.CurrentUser;
QuickMarkKey = QuickMarkKey.OpenSubKey("Software\\QuickMark", false);
szQuickMarkApp = QuickMarkKey.GetValue("QuickMarkAppPath").ToString();
QuickMarkKey.Close();

//Step 2:假如登錄檔資訊無法取得,設為預設路徑 \Program Files\QuickMark\QuickMark.exe

if (szQuickMarkApp.Length == 0)
szQuickMarkApp = "\\Program Files\\QuickMark\\QuickMark.exe";

//Step 3: 啟動QuickMark

if (File.Exists(szQuickMarkApp))
{
//Launch application
Process P = new Process();
P.StartInfo.FileName = szQuickMarkApp;
P.StartInfo.Verb = "Open";
P.Start();
P.WaitForExit(1000); //wait 1 second

//step 4: 傳送 RM_QuickMarkMessengerAPIApp 至所有上層的視窗。
//參數說明:
//HWND hWnd : HWND_BROADCAST ,發送消息至系統中所有上層視窗
//UINT Msg : 與QuickMark應用程式溝通的訊息id
//WPARAM wParam : 要接收結果的視窗
//LPARAM lParam : QuickMark應用程式開啟時,預設掃描的類型。(1: 一維條碼 2: 二維條碼)


int DefaultBarcodeType = 2; //預設為二維條碼

PostMessageW(HWND_BROADCAST, RM_QuickMarkMessengerAPIApp, messageWindow.Hwnd, (System.IntPtr)DefaultBarcodeType);
}

else
{
MessageBox.Show("QuickMark not found!");

}
}


#region MessageWindow


internal class MyMessageWindow : MessageWindow
{

private const int WM_COPYDATA = 0x004A;

//Receive the decoded result.
//STRUCT COPYDATASTRUCT member
//dwData: 未使用
//lpData: 回傳資料的指標,資料字串以Unicode編碼
//cbData: lpData的資料長度 (單位: bytes)
private MyMessageWindow messageWindow;



public struct COPYDATASTRUCT
{
public int dwData;
public int cbData;

public IntPtr lpData;
}



protected override void WndProc(ref Microsoft.WindowsCE.Forms.Message msg)
{
switch (msg.Msg)
{
case WM_COPYDATA:
{
char[] delimiterChars = { '\n' };
//字串的切割方式

String str = GetMsgString(msg.LParam);


string[] DecodeStrArray = str.Split(delimiterChars);
//將字串切割為陣列

// MessageBox.Show(str, "Result");


//顯示出str的內容

OutlookSession a = new OutlookSession(); //取得PDA OutlookSession的執行個體

AppointmentCollection col = a.Appointments.Items; //取得目前行事曆的所有的集合

Appointment appoi = col.AddNew(); //建立一個新行事曆
//appoi.co
appoi.Subject = DecodeStrArray[0];//主旨
appoi.Location = DecodeStrArray[1];//地點
appoi.Body = DecodeStrArray[2];//內容
appoi.Start = DateTime.Parse(DecodeStrArray[3]);//開始日期
appoi.End = DateTime.Parse(DecodeStrArray[4]);//結束日期
appoi.ReminderMinutesBeforeStart = 24*60;//提醒時間(一天前)
appoi.Update();//更新到行事曆的集合中
appoi.ShowDialog();//顯示剛剛新增的行事曆

}
break;
}
base.WndProc(ref msg);

}

public static string GetMsgString(IntPtr lParam)
{

if (lParam != IntPtr.Zero)//取得回傳結果字串
{
COPYDATASTRUCT st = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));
string str = Marshal.PtrToStringUni(st.lpData);
return str;


}

else
{

return null;

}

}




}
#endregion

}
}

1.以上的這段是我寫在手機內的QR code解碼器,不過現在的問題是,若在if那邊有成功解碼的話,就會回到protected override void WndProc這段並把解碼後的結果加入至手機行事曆中,但現在我想解決的問題是,若解碼失敗的話,他現在的問題是解碼失敗會出現 " 在msgapi.exe發生未預期的例外狀況,之前有大大說用try...catch去解決,可是能否告知完整程式碼?因為我試過都不行耶,本身程式能力不強,所以請各位大大解答一下。

2.然後我想做的是若失敗的話,會出現錯誤訊息,出現後程式會回到private void LaunchQuickMark()這段,我有試了一下,不過錯誤顯示"需要加入物件參考"之前在這篇http://www.blueshop.com.tw/board/FUM20050124192253INM/BRD20101122153659P4S.html,四樓的大大說的那個我懂,能否請各位大大指導一下,因為還蠻急的要解決此問題,所以希望各位大大可以不吝指教。

搜尋相關Tags的文章: [ if....else,try....catch,C#,windows mobile ] ,
本篇文章發表於2010-12-12 13:00
1樓
作者回應

wen
檢舉此回應
說錯了,四樓大大說的那個不懂
本篇文章回覆於2010-12-12 13:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

香帥
檢舉此回應
今天花了一點時間幫您的code模擬到我的pocket pc
發現您的try不該放那麼早,才能除錯,
因此將以下的try拿掉
private void menuItemOK_Click(object sender, EventArgs e)
{
LaunchQuickMark();

}
並將try放到下面:

因為我模擬執行時發現szQuickMarkApp = QuickMarkKey.GetValue("QuickMarkAppPath").ToString();
會產生錯誤,因此跟您改一下,就可以執行了,不過我的模擬手機沒有您的一些其他exe,因此會正常的秀出QuickMark not Found!這句話
就是有執行下列的程式,一切都還正常
else
{
MessageBox.Show("QuickMark not found!");

}

因此幫您改到這,有問題再說 ^_^
本篇文章回覆於2010-12-12 14:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Tai Chun Kuo
檢舉此回應
太棒了~
推推推推推推推推推推推
本篇文章回覆於2011-03-19 15:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.