C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.76685 の関連記事表示

<< 0 >>
■76685  WM_IME_CHARで正しく送れない
□投稿者/ 初心者 -(2015/08/03(Mon) 10:11:31)

    分類:[VB.NET/VB2005 以降] 

    AUTOCAD2004と2012で動作が変わってしまいます。原因が分からず困っています。
    何方か分かる方宜しくお願いします。
    「現象」
    CADに選択コマンド(SELECT)を送り、選択が完了するまで待機(ThisDrawing.WaitPrompt関数で)
    し、その後CADにコマンドを送るコードですが、(この例では"_UCS W ")
    2004では正常にCADに送れていますが、
    2012では、文字部分が送れず、スペースだけが送られているようです。(何故ならCAD上ではスペースを押した時と同一な動作をしている)
    「分かったこと」
    処理の途中で選択するためのCADのマウス等の操作が介入することが原因のようです。
    事前に選択状態にして実行した場合は、マウス操作が介入しないので、正しく送られます
    (この場合、"_UCS W ")

    問題は、2004では正しく動作しているのに、なぜ、2012において文字が送られなくなるのかです。
    考えられる回避策等があれば、宜しくお願いします。

    [環境]
    WIN7, VisualStudioExpress2013

    [実行コード]
    SendCommandPost("_SELECT ")
    'この処理(WaitPrompt)は、AUTOCADのSELECTコマンドの選択が終了するまで
    '待機する関数です
    ThisDrawing.WaitPrompt()
       ThisDrawing.SendCommand("_UCS W ") 'ワールド座標に

    [サブルーチン]
    Public Function SendCommand(ByVal AcadCommand As String) As Boolean
    Dim lngrc As Long 'APIの返却値
    Dim i
    Dim lngdt As Long
    Dim strdt As String
    SendCommand = False
    lngrc = -1
    ' 1文字ずつ送信 
    For i = 1 To Len(AcadCommand)
    strdt = Mid(AcadCommand, i, 1)
    lngdt = AscW(strdt) 'ASCIIコードに変換
    lngrc = SendMessage(MWndCMD, WM_IME_CHAR, lngdt, 0) '1文字送信
    Next i
    End Select
    SendCommand = SendCommand
    End Function


親記事 /過去ログ129より / 関連記事表示
削除チェック/

■76688  Re[1]: WM_IME_CHARで正しく送れない
□投稿者/ 魔界の仮面弁士 -(2015/08/03(Mon) 11:18:20)
    2015/08/03(Mon) 11:20:11 編集(投稿者)

    No76685 (初心者 さん) に返信
    > AUTOCAD2004と2012で動作が変わってしまいます。

    AutoCAD の知識は v13 あたりで止まっていて、AutoCAD VBA の利用経験が無いため、
    製品特有の事情には疎いのですが、その SendCommand という Function は、
    どこかに掲載されているサンプルコードだったりするのでしょうか?
    コードを見ると、同一では無いものの、下記と酷似しているようですが…(変数 i の型定義を忘れている点も含めて)
    > http://bbs.wankuma.com/index.cgi?mode=al2&namber=75421&KLOG=127



    > 問題は、2004では正しく動作しているのに、なぜ、2012において文字が送られなくなるのかです。
    何でしょうね…マルウェア対策で、キーエミュレートが意識的に弾かれているとか?
    まぁ、2012 では .NET への移行が進んでいるようですし、内部実装も大きく変わっているのかも。(妄想


    > 考えられる回避策等があれば、宜しくお願いします。
    Document オブジェクトに SendCommand メソッドが用意されているようですが、
    それでは送信できず、どうしても WM_IME_CHAR を使わなければならないのでしょうか。


    > [環境]
    > WIN7, VisualStudioExpress2013
    VBA ではなく VB.NET なのですね?
    だとしたら、API 宣言を間違えていたりはしないでしょうか。
    Mid & AscW が使われているあたり、VBA コードを直訳したかのような危うさを感じますし、
    > SendCommand = SendCommand
    という無意味なコードからも、デバッグ等が十分に行えていない印象を受けます。


    > Dim lngrc As Long 'APIの返却値
    > lngrc = SendMessage(MWndCMD, WM_IME_CHAR, lngdt, 0) '1文字送信
    VB.NET コードだとしたら、SendMessage の戻り値が Long 型なのは違和感が…。


    そもそも SendMessage API の戻り値は LRESULT という型であり、
    32bit 環境では「32bit 整数型」、64bit 環境では「64bit 整数型」を意味します。

    そのため、SendMessage の戻り値としては、
     VBA 7.0 以降なら As LongPtr
     VBA 7.0 未満なら As Long
     VB.NET なら As IntPtr
    が適切です。まぁ、他の宣言方法が無いわけでは無いですし、そもそも WM_IME_CHAR の場合は
    戻り値が『An application should return zero if it processes this message.』のため、
    値そのものには意味が無いのですが、型のサイズがちぐはぐであるのは望ましくないかと。
記事No.76685 のレス /過去ログ129より / 関連記事表示
削除チェック/

■76691  Re[2]: WM_IME_CHARで正しく送れない
□投稿者/ 初心者 -(2015/08/03(Mon) 16:51:18)
    魔界の仮面弁士さん回答本当にありがとうございます。
    動作すれば何とかなる思い、細かい部分がお座なりになっていたようです。
    変数の定義等プロの方が見るとなんか変で違和感を感じるでしょうね。
    気を付けます。
    少しわかりかけたので、もう少し確認してから再度質問したいと思います。
    ここは解決とします。
    その時はまた宜しくお願いします。


    > どこかに掲載されているサンプルコードだったりするのでしょうか?
    > コードを見ると、同一では無いものの、下記と酷似しているようですが…(変数 i の型定義を忘れている点も含めて)
    >>http://bbs.wankuma.com/index.cgi?mode=al2&namber=75421&KLOG=127
    参考にさせてもらいました。

    > Document オブジェクトに SendCommand メソッドが用意されているようですが、
    > それでは送信できず、どうしても WM_IME_CHAR を使わなければならないのでしょうか。
    Document オブジェクトは難しいため中断してました、でも勉強したほうがよいかなあ。

    >>[環境]
    >>WIN7, VisualStudioExpress2013
    > VBA ではなく VB.NET なのですね?
    ごめんなさい VB.NETです。

記事No.76685 のレス / END /過去ログ129より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -