none
C#で他のアプリケーションを操作する方法を教えてください。 RRS feed

  • 質問

  •  

    C#で他のアプリケーションを操作する方法を教えてください。

     

    具体的には、

    OmegaChartという株価解析のソフトを外部のC#もしくはVB6.0

    から操作したいと思って思考錯誤していますが、うまくいきません。

     

    OmegaChartは立ち上がったウインドウ上で証券コード、ここでは

    たとえばヤフーの場合9984を入力すると、小さいウインドウが開いて

    9984と入力され、Enterを押さずともヤフーの株価グラフが表示され

    ます。

     

    これを外部のC#もしくはVB6.0で操作したいのです。

    まず、VB6.0(正確にはVBAでエクセル上から)で以下のコードを

    書きましたが、うまくいきませんでした。

     

    ご教示よろしくお願いいたします。

     

    Declare Function SetFocus Lib "user32.dll" _
        (ByVal hWnd As Long) As Long
       
    Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" _
        (ByVal hWnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, ByVal lParam As Long) As Long

           
    Public Const WM_SETTEXT As Integer = &HC
    Public Const WM_CHAR As Integer = &H102
    Public Const WM_KEYDOWN As Integer = &H100
    Public Const VK_RETURN As Integer = &HD

    Sub remote_omega()
        Dim hWnd As Long
        hWnd = FindWindow(vbNullString, "Omega Chart")
        ret = PostMessage(hWnd, WM_CHAR, Asc("9"), 0)
        ret = PostMessage(hWnd, WM_CHAR, Asc("9"), 0)
        ret = PostMessage(hWnd, WM_CHAR, Asc("8"), 0)
        ret = PostMessage(hWnd, WM_CHAR, Asc("4"), 0)

    End Sub

     

    2007年12月7日 10:25

回答

  •  ぽぴ王子 さんからの引用
    他のアプリケーションにキー入力を行わせるには、いったんそのアプリケーションをアクティブにしてやって、それから keybd_event あるいは SendInput を使うのが一般的だったと思います。使ったことがないのでなんとも言えませんが。


    ですね。アクティブであることを保証しないと迷惑なアクションを起こしてしまいます。
    Activate してから SendInput 関数か SendKeys クラスでしょうね。


    私は使ったことがないわけではありませんが、あまり好きでないソリューションです。

    2007年12月11日 3:37

すべての返信

  • なっぷさん、こんにちは。

    まず API 宣言の型が間違っているのが気になります。
    P/Invoke.net というサイトで調べてみてください。

    2007年12月10日 4:25
  •  じゃんぬねっと さんからの引用

    なっぷさん、こんにちは。

    まず API 宣言の型が間違っているのが気になります。
    P/Invoke.net というサイトで調べてみてください。

    こう書いてあるので、P/Invoke.net は関係ないかもしれませんね。

     なっぷ さんからの引用

    まず、VB6.0(正確にはVBAでエクセル上から)で以下のコードを
    書きましたが、うまくいきませんでした。

    C# から操作するには、じゃんぬねっとさんが言われるとおり、API 宣言が違ってきますので P/Invoke.net ( http://pinvoke.net/ )というサイトで調べてみるのがいいと思います。

    ただ、自分以外のソフトを操作する、あるいはキー入力させるなどの動作は、意外と高度な技術を要する話になりそうです。単に PostMessage すればいいというものでもないですし。

    2007年12月10日 4:58
  •  ぽぴ王子 さんからの引用
    こう書いてあるので、P/Invoke.net は関係ないかもしれませんね。


    自信があれば C# のコードを貼っているでしょうから、

    私は C# にそのまま構文だけ挿げ替えたものを記述している可能性が高いと見ました。

    2007年12月10日 5:33
  •  じゃんぬねっと さんからの引用

    自信があれば C# のコードを貼っているでしょうから、

    私は C# にそのまま構文だけ挿げ替えたものを記述している可能性が高いと見ました。

     

    そう言われると確かにそうかもしれませんね(質問者さんの真意はわかりません)。

    確か他のアプリケーションにキー入力を行わせるには、いったんそのアプリケーションをアクティブにしてやって、それから keybd_event あるいは SendInput を使うのが一般的だったと思います。使ったことがないのでなんとも言えませんが。

    ただ、Windows2000以降であれば keybd_event よりも SendInput を使用すべきとなっていたと思います。

    2007年12月11日 2:02
  •  ぽぴ王子 さんからの引用
    他のアプリケーションにキー入力を行わせるには、いったんそのアプリケーションをアクティブにしてやって、それから keybd_event あるいは SendInput を使うのが一般的だったと思います。使ったことがないのでなんとも言えませんが。


    ですね。アクティブであることを保証しないと迷惑なアクションを起こしてしまいます。
    Activate してから SendInput 関数か SendKeys クラスでしょうね。


    私は使ったことがないわけではありませんが、あまり好きでないソリューションです。

    2007年12月11日 3:37
  • みなさま、ご回答ありがとうございます。

     

    その後、試行錯誤しました。

    OmegaChartで他アプリのコントロールをやる前に、よく例として出てくる

    Windowsの電卓で同じようなことをやってみました。

    その結果以下のコードではうまくいきました。

    しかし、OmegaChartではうまくいきませんでした。

    このため、Excelから直接コントロールすることは諦め、UWSCでコントロール

    することにしました。たまにうまくいかないことがありますが、7割くらいの確率で

    正常動作しています。(うまくいかないのは、証券コードを入力する子ウインドウが

    開くためのようです。)

     

    なお蛇足ですが、ご指摘いただいた、keybd_input はVBorVBAでは使えません。

     

    ありがとうございました。

     

    Sub remote_omega5()
        Dim hWnd As Long
        hWnd = FindWindow(vbNullString, "電卓")

        'Call SendMessage(ThWnd, WM_SETTEXT, 0, ByVal "9984") '---> タイトルが変わる
        'ret = PostMessage(hWnd, WM_CHAR, Asc("9984"), 0) '---> 最初の9が送られるのみ!
        ret = PostMessage(hWnd, WM_CHAR, Asc("9"), 0)

        SetForegroundWindow hWnd
       
        'we assign our params the values we got from spy++
        wParam = &H12
        lParam = &H20380001
        'simulate a alt keystrokeV
    '    ret = PostMesTsage(hWnd,TTT WM_SYSKEYDOWN, wParam, lParam)
    '    ret = PostMessage(hWndVVT, WM_SYSKEYUP, wParam, lParam)
        SendKeys ("%V")
        SendKeys ("T")

    '    Call SetActiveWindow(hWnd)
    '    ret = PostMessage(hWnd, WM_CHAR, Asc("V"), 0)
    '    ret = PostMessage(hWnd, WM_CHAR, Asc("T"), 0)
    End Sub

     

     

     

    2007年12月11日 11:36
  •  なっぷ さんからの引用

    なお蛇足ですが、ご指摘いただいた、keybd_input はVBorVBAでは使えません。


    正しくは keydb_event のことだと思いますが、Declare で宣言しても使えないのでしたっけ?
    私は VB6 時代に普通に使っていましたけど...

    2007年12月12日 8:27