ページ

ラベル BarcodeReader の投稿を表示しています。 すべての投稿を表示
ラベル BarcodeReader の投稿を表示しています。 すべての投稿を表示

2010-11-19

QRリーダー v1.1

QRリーダーを更新しました。

  •  QRリーダー v1.1
  •  QRリーダー v1.1
    (2010.11.20 16:54 リンク先が間違えていましたので修正しました。@guru084さん ご連絡ありがとうございました)

QRコード作成時に au向けのメールアドレスの指定方法を間違えていた問題を修正しました。(と言いながら au実機ではテストできていないので実は修正できてないかも...)
残念ながら読み取り精度が向上したりはしません(笑

実は少し前に修正していたのですが、アップするのを忘れている間に Marketplace にアップできない問題が発生して中途半端になっていました。さっきカタログに送信したので近いうちに Marketplace にも出てくると思います。

2010-10-13

QRリーダー v1.0

QRリーダーを MarketplaceGiraffeに登録しました。
こちらにも CABを置いておきますので お好みの方法でインストールしてください。
(Windows Phone7からは こういう風に自由に配布ができなくなるのですね・・・)


v0.9から以下の内容を変更しています
  • メールアドレスをタップしたときにセキュリティのダイアログが出ていた問題を回避
  • ボタンをタップした時に絵が欠けていた問題を修正
  • QRコード読み込み部分をちょっとだけ調整

Marketplaceや Giraffeではじめてインストールして頂いた方向けに補足(言い訳)しておくと、このプログラムは カメラで撮影したQRコードを オープンソースのバーコードライブラリ ZXingを利用して解析しています。このライブラリはかなり優秀で 普通に画像を読ませるとほぼ間違いなく認識してくれます。

にも関わらず 実際に動かしてみると認識できない事が多いのではないかと思います。
被写体からある程度離してフォーカスを合わせた後、ズームでできるだけ画面中央に大きく写すと認識しやすい気がする(手ぶれは厳禁ですw)のですが かなり利用者の腕に依存するアプリになっちゃってますので、読めたらラッキーくらいでご利用頂ければと思います。


2010-10-06

WebBrowserコントロールのコンテキストメニューを無効化する (修正)

昨日アップした QRリーダー v0.8ですが、WebBrowserコントロールのコンテキストメニューは出なくなったものの URLのタップもできなくなっていました... ダメじゃんorz

という訳で修正版です。

昨日はこんなコード書いていましたが、いろいろ実験していた時の内容でした。
WM_NOTITY止めたら何も反応しなくなります。
protected virtual int WndProc(IntPtr hwnd, uint msg, uint wParam, int lParam)
{
    if (WM_NOTITY == msg ||
        WM_INITMENUPOPUP == msg ||
        WM_ENTERMENULOOP == msg)

    {
        return 0;
    }

    return CallWindowProc(this._oldWndProcPtr, hwnd, msg, wParam, lParam);
}

正しくはこう、 WM_CONTEXTMENUを止めるだけですね。
protected virtual int WndProc(IntPtr hwnd, uint msg, uint wParam, int lParam)
{
    if (WM_CONTEXTMENU == msg)
    {
        return 0;
    }

    return CallWindowProc(this._oldWndProcPtr, hwnd, msg, wParam, lParam);
}
つまらないことでバージョン番号を消費してしまいました。
次で正式版になる気がしないです(笑


2010-10-05

WebBrowserコントロールのコンテキストメニューを無効化する

QRリーダーを使っていただいた方はお気づきだと思いますが、画面下段の結果表示部分はWebBrowerコントロールを使っています。

WebBrowserコントロールなので タップ&ホールドすると コンテキストメニューが表示されてしまうのですが、表示される意味が無いので何とかしたいところです。(”すべてのテキストを選択” と ”ズームレベル” はそこそこ有用かもしれませんが・・・)

ContextMenuプロパティに NULLをセットしてみたりもしたのですが、効果ありませんでした。

リモートスパイで覗いてみると WebBrowserコントロールの下に IExploreというウィンドウがあって更にその下に MSPIE Statusと PIEHTMLというウィンドウがあるみたいです。さすがに複雑な構造になっているんですね。
ちなみにタップ&ホールドした時のメッセージは PIEHTMLが受け取っていました。

対象がわかったのでこのコントロールにメッセージを渡さないようにします。

まずは P/Invokeの準備。
せっかく .NETで作ってるのに結局はこうなるのか と思わないでもないですが...
#region P/Invoke関係
[DllImport("coredll.dll")]
private extern static IntPtr SetWindowLong(IntPtr hwnd, int nIndex, IntPtr dwNewLong);
private const int GWL_WNDPROC = -4;

[DllImport("coredll.dll")]
private extern static int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hwnd, uint msg, uint wParam, int lParam);
private const uint WM_NOTITY = 0x004E;
private const uint WM_INITMENUPOPUP = 0x0117;
private const uint WM_ENTERMENULOOP = 0x0211;

[DllImport("coredll.dll")]
private extern static IntPtr GetWindow(IntPtr hwnd, uint uCmd);
private const uint GW_HWNDNEXT = 2;
private const uint GW_CHILD = 5;

[DllImport("coredll.dll", EntryPoint = "GetClassNameW", CharSet = CharSet.Unicode)]
public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
private const string PIEHTML = "PIEHTML";
private const int MAX_CLASSNAME = 64;

private delegate int WndProcDelegate(IntPtr hwnd, uint msg, uint wParam, int lParam);

private IntPtr _oldWndProcPtr;
private IntPtr _newWndProcPtr;
private WndProcDelegate _wndProc;
private IntPtr _hWndPIEHTML;
#endregion

次に差し替えるウィンドウプロシージャを準備。
特定のメッセージを無視しているだけです。
protected virtual int WndProc(IntPtr hwnd, uint msg, uint wParam, int lParam)
{
    if (WM_NOTITY == msg ||
        WM_INITMENUPOPUP == msg ||
        WM_ENTERMENULOOP == msg)

    {
        return 0;
    }

    return CallWindowProc(this._oldWndProcPtr, hwnd, msg, wParam, lParam);
}

フォームのコンストラクタで WebBrowser(の孫ウィンドウ)をサブクラス化します。
Windows Mobileには EnumChildWindows()が無いのでちょっと面倒ですね。
ヘッダ眺めてたら普通にありましたw
もう少し楽に書けそうですが、作った後だったのでまぁいいか...。
// P/InvokeでWebブラウザコントロールをサブクラス化
// WebBrowserの下の IExploreの下の MSPIE Statusの次の PIEHTMLが目的
this._hWndPIEHTML = IntPtr.Zero;
IntPtr hWndIExplore = GetWindow(this.webBrowser.Handle, GW_CHILD);
if (IntPtr.Zero != hWndIExplore)
{
    IntPtr hWnd = GetWindow(hWndIExplore, GW_CHILD);
    StringBuilder sbClassName;
    while (IntPtr.Zero != hWnd)
    {
        sbClassName = new StringBuilder(MAX_CLASSNAME);
        GetClassName(hWnd, sbClassName, sbClassName.Capacity);
        if (PIEHTML == sbClassName.ToString())
        {
            this._hWndPIEHTML = hWnd;
            break;
        }
        hWnd = GetWindow(hWnd, GW_HWNDNEXT);
    }
}

if (IntPtr.Zero != this._hWndPIEHTML)
{
    this._wndProc = new WndProcDelegate(WndProc);
    this._newWndProcPtr = Marshal.GetFunctionPointerForDelegate(this._wndProc);
    this._oldWndProcPtr = SetWindowLong(this._hWndPIEHTML, GWL_WNDPROC, this._newWndProcPtr);
}

一応、終了時に後始末をしておきます。
protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        if (IntPtr.Zero != this._hWndPIEHTML)
        {
            SetWindowLong(this._hWndPIEHTML, GWL_WNDPROC, this._oldWndProcPtr);
        }
        components.Dispose();
    }
    base.Dispose(disposing);
}
という訳でようやくコンテキストメニューを無効化できました。
他にもアドレス帳の登録で項目を間違えていた部分があったので修正しています。

今回から ひっそりと Giraffe に登録しています。
もう少し完成度が上がったら Marketplaceにも登録したいのですが先は長そうですね。

2010-09-24

QRリーダー v0.7



twitter等でいろいろご指摘頂いて、少し手直ししました。

修正点はこんな感じです。
  • エンコードの判定を誤ってしまう事があったので修正
    (というか 日本語版WinMoでは常に Shift_JISで OK?)
  • 読み取り結果の文字表示を少し大き目に変更
  • 連絡先に誕生日が入力されていたときに月が読めていなかった
  • 作成したQRコードを保存可能にした

他にも怪しいところはあると思いますので、何かあれば教えてください。
 

2010-09-21

QRリーダー v0.6

T-01B用バーコードリーダー(仮称)あらため QRリーダーv0.6をリリースします。

リリースというとカッコいいのですが、実はテストが面倒になってきたので他人任せにしてしまおうなどと邪な事を考えています。何かお気づきの点があればお知らせください。


UIを少し手直ししましたが 機能は以前と同じで、カメラで撮影した QRコードの内容を読みます。

この「カメラで撮影した」というのがミソで、現状 かなり上手に写真を撮らないと認識する事ができません。画面の中央で気持ち大き目に撮影するのがコツですが、あまりズームすると手ぶれで台無しになってしまいます。

かなりユーザーの技術に依存しているような気がしますが、そこは慣れで何とかしてください(笑


また QRリーダーという名前になりましたが、QRコードの他に EAN8(JAN8)、EAN13(JAN13)、CODE39、CODE128を読むこともできます。
ただ、CODE39などはサイズが大きくなりがちなので写真を撮るのが大変かもしれませんね。


その他、QRコードの内容がドコモや au(ソフトバンクも?)の電話帳登録機能形式の場合、そのままアドレス帳に登録することがきでます。

一応、以下の資料を参考にしています。
作ろうiモードコンテンツ:電話帳登録機能
KDDI au バーコード  アドレス帳一括入力機能
逆にアドレス帳の内容で QRコードを作成する事もできます。
ただ、普通の携帯を持っていないので 実は本当に読めるのか試せていません...。是非動作確認をお願いします。

2010-09-11

T-01B用バーコードリーダー修正 (その3)

バーコードリーダー(仮称)で、指定した連絡先の内容を QRコードを表示できるようにしてみました。(その代わり画面が退化してるかもしれません...)

バーコードリーダー v0.5

名前とメールアドレス、携帯電話番号、自宅番号程度は渡せると思いますが、変なところを読んでいたら こっそり教えてください。

だんだんと脱線してきて、既に「リーダー(仮称)」じゃないじゃん...という気もしてきました。そろそろ名前を考えてあげたいところです。







2010-09-04

T-01B用バーコードリーダー修正 (その2)


先日アップしたバーコードリーダーで連絡先に登録できるようにしたつもりだったのですが、手元の名刺1枚でしかテストしていませんでした。

QRのススメというサイトを教えていただいて試したところ、ほとんど認識できてなかったという衝撃の事実(笑)が判明しましたので こっそりと修正しておきます。
コメント頂いた方に感謝です。


そろそろ真面目に画面作らないといけないのですが、個人的には需要が無くなりつつあるので どうしたものかと悩み中です。

2010-08-31

T-01B用バーコードリーダーちょっとだけ修正


先週のバーコードリーダー(仮称)を少し修正しました。
ここに置いておきますので よろしければお試しください。

  • それっぽいアイコン作りました(笑
    (先にコード書け)
  • QRコードを読み込んだ時、内部でグレースケール化してみました
    (もしかして逆効果?)
  • QRコードの内容をアドレス帳に登録します
    (MECARDや MEMORYが埋め込まれていた場合)

アドレス帳の登録に至っては まだ名刺1枚しか試していません、ドコモ形式(MECARD)以外を試した方は結果を教えてください。

2010-08-23

T-01B用バーコードリーダー認識率調整版

昨日のT-01B用バーコードリーダー(仮名)ですが、ちょっと調整したらかなり認識するようになりました。

ここに置いておきますので、よろしければお試しください。
(書き忘れていましたが、実行には .NET Compact Framework 3.5が必要です)

動くようになって 俄然やる気が出てきたのですが、明日から出張で続きを作れないんですよね...ちょっと残念です。

2010-08-22

バーコード読み込みチャレンジ中

T-01Bにはバーコードを読み取るソフトが付いていませんね。

twitterで QuickMarkが使えるよと教えたいただいたのですが、どうも動作が緩慢で実用にはならないのかな...と感じました。

無いなら作れという事で、オープンソースのバーコードライブラリ ZXingを使ってバーコードリーダを作成中です。作成中ですというのは、つまり まだ動いてないという事です(笑

 現状、普通のバーコードはそれなりに読むのですが QRコードでかなり苦戦中です...というか印刷物を読めた試しがありません。

あまりにも悲しいので数少ない成功例のキャプチャをアップさせてください。PCの画面からなら時々読めるような気がします...

たぶん画像にある程度 前処理をしてやらないと認識できないんだと思いますが、そろそろ飽きてきたので 作りかけのものをここに置いておきます。

まだ動かない機能も多いのですが、よろしければ試してみてください。