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

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

C# と VB.NET の入門サイト

Re[2]: WM_IME_CHARで正しく送れない


(過去ログ 129 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■76685 / inTopicNo.1)  WM_IME_CHARで正しく送れない
  
□投稿者/ 初心者 (13回)-(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



引用返信 編集キー/
■76688 / inTopicNo.2)  Re[1]: WM_IME_CHARで正しく送れない
□投稿者/ 魔界の仮面弁士 (429回)-(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.』のため、
値そのものには意味が無いのですが、型のサイズがちぐはぐであるのは望ましくないかと。
引用返信 編集キー/
■76691 / inTopicNo.3)  Re[2]: WM_IME_CHARで正しく送れない
□投稿者/ 初心者 (14回)-(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です。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -