exeソフトのボタンの遠隔操作するには?パート2


hiro  2004-06-17 09:04:47  No: 113966  IP: [192.*.*.*]

またまたすみません。先ほど聞くのわすれていたのですが
テキストボックスに文字入力が

Atext=”12345” & vbCrLf
Code =SendMessage(ChildWindowHandle,WM_SETTEXT,0,ByVal Atext)

このvbCrLfで、改行だと思うのですが、
例えば、このテキストボックスにフォーカスを置きキーボードのエンターを押す
→”123”入力→キーボードのエンターを押す
このよう動きをさせる場合どのようにすればよいか教えてください。
現在は、”123”入力まではできました。それと、vbCrLf←これを使うと
123・・・となってしまいます。
よろしくお願いします。

編集    削除
Say  2004-06-17 09:57:52  No: 113967  IP: [192.*.*.*]

MultilineがTrueになってないだけでは?

編集    削除
hiro  2004-06-17 10:24:50  No: 113968  IP: [192.*.*.*]

ん〜やってみたのですが、できませんでした。
ただ、テキストボックスを1度クリックして(多分フォーカスを与えるってことだと思うのですが..)から、キーボードのエンターを押すという流れの場合は
どのようにすればよいか、よろしくお願いします。

編集    削除
マグ  2004-06-17 18:06:58  No: 113969  IP: [192.*.*.*]

AutoSizeを確認して見てください。(テキストが一行ではなく複数行入力できるようになっていますか?)

Sayさんの言ったようにMultilineの確認

WordWrapの確認

私の場合これしか思いつきませんでした。

編集    削除
hiro  2004-06-18 02:54:29  No: 113970  IP: [192.*.*.*]

AutoSize Multiline はプロパティによって変更だと思うのですが、
exeソフトの時も、AutoSize Multilineをtrueにどのようにするんですか?

(テキストが一行ではなく複数行入力できるようになっていますか?)

表示画面としては  リストボックスがありテキストボックスの2つあり
テキスト入力するとリストボックスに表示される(exeソフトの中)ものなのですが
手順としては、テキストボックスに数字入力しリストボックス(20項目)に
キーボードのエンターにより入力(1項目)。それの繰り返しでエンターで次の項目。数字入力、エンター.....この繰り返しなのですが、それをボタン1回押すだけで、すべて入力できるようにしたいんですが、よいアドバイスあればよろしくお願いします。

編集    削除
Say  2004-06-18 09:15:15  No: 113971  IP: [192.*.*.*]

>exeソフトの時も、AutoSize Multilineをtrueにどのようにするんですか?

TextBoxにAutoSizeプロパティはありません。

また、
単一行TextBoxと複数行TextBoxは本来別物で、
デザイン時のMultilineの設定に従って実行開始時にすげかえているだけですから、
実行中にMultilineを変更することはできません。
(これはVBの世界の話でなく、OSの作りの話になりますから、APIを使っても変更不可です。)

というわけで既存のExeに対し、単一行TextBox→複数行TextBox変換はできませんから、
コンパイル前に編集画面でMultilineを変更しておいてください。
自作でないExeファイルの場合は、ソース入手不可能ならあきらめてください。

参考までに、
GetWindowLongでGWL_STYLEを指定して取得できる値(スタイル)の中に
ES_MULTILINE(複数行テキスト)がありますが、
これを単一行TextBoxに対しSetWindowLongしても
複数行テキストにはなりません。
この定数はCreateWindowでTextBoxを作成するときに
複数行指定するために存在します。

理由は、前述したように、単一行TextBoxと複数行TextBoxは
本来別物ですから、Create時に選択することはできても、
すでに作られたTextBoxに対しては、スタイルを変更しようとしてもできないからです。

ちなみに、複数行TextBoxをCreateWindowするサンプルはここ。
http://www.vbapihelpline.de/const/constk.php4?Func=ES_MULTILINE&Letter=Textboxen
ドイツ語だけど、ま、いいか・・・。(^_^;
(日本語がよければ、この掲示板の過去ログ探せば、つい最近書いた記憶が・・・。)

>テキスト入力するとリストボックスに表示される(exeソフトの中)ものなのですが
ListBoxにデータを流し込むだけなら、LB_ADDSTRINGをSendMessageするとか。
(ボタンのClickイベントの中でAddItem以外の処理をやっていたら無意味ですが)

編集    削除
 2004-06-18 17:48:58  No: 113972  IP: [192.*.*.*]

> キーボードのエンターにより入力(1項目)。それの繰り返しでエンターで次の項目。
ということなので、もしかしてEnterキーで次のテキストに移動したい?

SendMessage(hWnd, WM_NEXTDLGCTL, 0, 0)

とかはどうでしょうか。

編集    削除
ぴろあき  2004-06-18 19:19:19  No: 113973  IP: [192.*.*.*]

>>エンターを押したい
>改行したいという事ですよね。
>エンターを押す(キーボードをエミュレートする)プログラムと、
>改行する(改行コードを送る)プログラムは違います。
>以下、後者を想定してアドバイスします。

前回の質問で、後者を想定してアドバイスしましたが、
前者、つまり改行させたいのでは無く、エンターを押したかった訳ですね。

そういう事であれば、
AppActivate
SetFocus(ChildWindowHandle)   
Keybd_event(VK_RETURN,0,0,0)
Keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0)
多分こんな流れでよいかと。。。
SetFocusを使った事が無いので、その辺が微妙ですが、
一応、対象アプリの対象TextBoxにフォーカスを置いて、
エンターキーをエミュレートできるハズです。

編集    削除
kara  2004-06-18 23:26:56  No: 113974  IP: [192.*.*.*]

すみません回答ではないです

Sayさんが
> TextBoxにAutoSizeプロパティはありません。
と言われていますが
VB.NETのテキストボックスには存在します
VB6.0のテキストボックスには確かに存在しませんが・・・

hiroさんの環境は過去の質問などから
VB6.0であることがわかるので
間違ってはいませんが
誤解を与えてしまいそうな気がしたので
勝手ながら補足させていただきました

気分を害されたとしたら申し訳ありません

編集    削除
hiro  2004-06-19 07:18:11  No: 113975  IP: [192.*.*.*]

皆さんありがとうございます。こんな初心者ごとの質問に親切に回答すごくうれしいです。(自分の環境はVB6.0です>補足の説明ありがとうございます=karaさん)
  また、自分の質問が悪くいろんなニアンスで、いろいろ考えさせてしまいすみませんでした。
SendMessage(hWnd, WM_NEXTDLGCTL, 0, 0)
この方法も試したのですがだめでした。おそらくsayさんの言っている通り、
>コンパイル前に編集画面でMultilineを変更しておいてください。
>自作でないExeファイルの場合は、ソース入手不可能ならあきらめてください。
exeファイルが自作ではないので、現段階では不可能なのかもしれません。(キ▼д▼;)トホホ・・
ただ、ひろあきさんの
>AppActivate
>SetFocus(ChildWindowHandle)   
>Keybd_event(VK_RETURN,0,0,0)
>Keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0)
は、どのように書けばよいのでしょうか?(すみません、何から何まで聞いてしまい...一応自分でも調べて試してはいるのですがなかなかわかりません....)
一つの提案なのですが(まだ、やり方が分からず試みてないのですが..)
まず、テキストボックスにフォーカスをおき、そこに入力フォーカスのあるウィンドウにデータを送る方法(sendkeys)これを使うとどーなんでしょう??
(Enter {ENTER} または ~ )
すみませんがよろしくお願いします。

編集    削除
hiro  2004-06-19 07:20:56  No: 113976  IP: [192.*.*.*]

皆さんありがとうございます。こんな初心者ごとの質問に親切に回答すごくうれしいです。(自分の環境はVB6.0です>補足の説明ありがとうございます=karaさん)
  また、自分の質問が悪くいろんなニアンスで、いろいろ考えさせてしまいすみませんでした。
SendMessage(hWnd, WM_NEXTDLGCTL, 0, 0)
この方法も試したのですがだめでした。おそらくsayさんの言っている通り、
>コンパイル前に編集画面でMultilineを変更しておいてください。
>自作でないExeファイルの場合は、ソース入手不可能ならあきらめてください。
exeファイルが自作ではないので、現段階では不可能なのかもしれません。(キ▼д▼;)トホホ・・
ただ、ひろあきさんの
>AppActivate
>SetFocus(ChildWindowHandle)   
>Keybd_event(VK_RETURN,0,0,0)
>Keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0)
は、どのように書けばよいのでしょうか?(すみません、何から何まで聞いてしまい...一応自分でも調べて試してはいるのですがなかなかわかりません....)
一つの提案なのですが(まだ、やり方が分からず試みてないのですが..)
まず、テキストボックスにフォーカスをおき、そこに入力フォーカスのあるウィンドウにデータを送る方法(sendkeys)これを使うとどーなんでしょう??
(Enter {ENTER} または ~ )
すみませんがよろしくお願いします。

編集    削除
ぴろあき  2004-06-21 20:56:25  No: 113977  IP: [192.*.*.*]

>一つの提案
私の提案と同じです。
ただひとつ違うのは、SendKeysの代わりにkeybd_eventを使用している点です。
SendKeysはいろいろと問題があるので。。。

<SendKeysの問題点>
http://support.microsoft.com/default.aspx?scid=kb;ja;179987
http://support.microsoft.com/default.aspx?scid=kb;ja;JP408402
http://www.gj.il24.net/~nakasima/vb/trap/

AppActivate(MSDNヘルプ参照)
対象アプリをアクティブにする

SetFocus(API)
ハンドルを渡されたウィンドウをキーボードフォーカスを持つウィンドウにする

keybd_event(API)
アクティブなウィンドウにキーボード状態(仮想)を送る
KEYEVENTF_KEYUP = &H2 
VK_RETURN = &HD
を定義すれば、そのまま使えますが。。。

エンターキーを押す
Keybd_event(VK_RETURN,0,0,0)
エンターキーを離す
Keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0)

編集    削除
hiro  2004-06-28 11:12:17  No: 113978  IP: [192.*.*.*]

( ^-^)ノ(* ^-^)ノこんばんわぁ♪
またまた質問なのですが、まず、アクティブにするには
appactivate(string1 , string2 )
        string1 :タイトルバー文字列
        string2 :クラス名
でよいのでしょうか?
で、フォーカスがいまいち分からないのですが、どのように組めばよいかお願いします。
そのまま  SetFocus(ChildWindowHandle) でいいのでしょうか?
いろいろ聞いてしまい真にすみませんが、よろしくお願いします

編集    削除