none
電卓のテキストボックス文字列の取得方法 RRS feed

  • 質問

  • Windows7の電卓のテキストボックスの文字列を取得しようと思い
    下記のとおりコーディングしたのですが動作しませんでした。

    hChildWndが取得できていないようで、Staticの部分をEditとしてみても
    駄目でした。

    どのようにすれば動作するのか、どなたかご教示いただけましたら幸いです。

             [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

            [DllImport("user32.dll", SetLastError = true)]
            static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, StringBuilder lParam);

            private const int WM_GETTEXT = 0x000D;

          
            private void button1_Click(object sender, EventArgs e)
            {

                IntPtr hWnd = FindWindow(null, "電卓");

                if (hWnd != null)
                {
                    IntPtr hChildWnd = FindWindowEx(hWnd, IntPtr.Zero, "Static", "");

                    StringBuilder sb = new StringBuilder(256);

                    SendMessage(hChildWnd, WM_GETTEXT, 255, sb);

                     textBox1.Text = sb.ToString();

                }

            }


    • 編集済み girou2 2012年1月14日 12:58
    2012年1月14日 12:57

すべての返信

  • ネイティブコードで同等の処理を行った際、目的の文字列は取得できることは確認済みですか?
    2012年1月14日 13:46
  • ネイティブコードで同等の処理を行った際、目的の文字列は取得できることは確認済みですか?

    C#環境よりないため他の方法での確認はしておりません。
    • 編集済み girou2 2012年1月14日 19:52
    2012年1月14日 19:51
  • API のエラー コードを見て、どこで失敗しているかを確認するくらいはすべきだとは思うのですが。
    ちなみに、こんなのあります。

    方法 : マウス イベントとキーボード イベントをコードでシミュレートする
    http://msdn.microsoft.com/ja-jp/library/ms171548.aspx
    • 編集済み totojo 2012年1月14日 20:12
    2012年1月14日 20:10
  • FindWindowEx(hWnd, IntPtr.Zero, "Static", "")
    に0が返っているのでエラーではなく見つからないと判断してしましました。

     Marshal.GetLastWin32Error()でも0が返っています。

    当方のコンパイラ環境を記載しておりませんでした。
    申し訳ありません。当方はMicrosoft Visual C# 2008 Express Edition
    を使っているのですが、これでネイティブコードで同等の処理というのは
    可能なのでしょうか。

    2012年1月14日 23:29
  • 当方はMicrosoft Visual C# 2008 Express Edition
    を使っているのですが、これでネイティブコードで同等の処理というのは
    可能なのでしょうか。

    ほとんどの場合は可能ですし、今回の目的で困ることはありません。

    そもそも、電卓のウィンドウ構成をきちんと調べていますか?
    手元の Windows 7 の電卓を見る限り、「電卓」ウィンドウの直下に Static のウィンドウはいないようですが。
    Spy++ で、操作対象のウィンドウ構成をきちんと調べてください。
    ただし、Windows 7 の電卓は複数の電卓モードがあるので、ウィンドウ構成が微妙に変化します。一つの電卓の種類をカバーできたからといって、すべてで使えるわけではありませんのでご注意ください。(手元の実験結果によると、統計だけ違うかも)

    なお、Windows のバージョンが違うと、電卓のウィンドウ構成が異なる可能性があります。
    複数のバージョンの Windows をサポートする必要があるのであれば、それぞれで調べてください。

    # そこらのサンプルをまねするだけではだめです。
    # 調べ方がわからないなら調べ方から調べましょう。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2012年1月15日 0:16
    モデレータ