イメージ的にはIDManager(http://www.vector.co.jp/soft/win95/util/se293330.html)のような挙動をすることを差します。
http://www.hatena.ne.jp/1078797409#
任意の文字列を他アプリケーションに張付けるには、VBではどのようにすれば実現できるでしょうか? イメージ的にはIDManager(http://www.vector.co.jp/soft/win95/util/se2.. - 人力検索はてな
自分もそんなソフトをVCで作りましたというか作ってます。
IDManagerの挙動がいまいちわかりませんが
指定されたIDのところにもっていって
ペーストをするような感じだと
1 keybd_event API を使う
2 クリップボードに選択文字をコピーする
ペーストする
をやればいいと思います。 ただ1の方法のほうが
コピーペースト禁止のものにも対応可能なので
いいかなとおもいます。
基本的な流れは
他アプリのウィンドウハンドル(親)取得
->文字を記入したいテキストボックス等のウィンドウハンドル(子)取得
->文字列の送信
となります。
上記HPの下の方にある[メモ帳を遠隔操作して遊ぼう]の部分が
参考になると思いますが、WindowsAPIの知識が必要になるので、
もしWindowsAPIのことがよくわからなければ少し苦労するかも
しれませんが、他アプリを操作するにあたって避けては
通れないので、頑張ってください。
また、指示のあるソフトは使用したことが無いのでなんとも
言えませんが、説明を読んだ感じだけで思ったのは、
子ウィンドウハンドル取得の際、貼り付け先が最前面の
ウィンドウだと限定してやると楽かもしれません。
本当は文字列を送るにはクリップボード経由が一番楽なんですが、
貼り付けという作業が一つ増えてしまうのが難点ですね。
http://nienie.com/~masapico/api_GetForegroundWindow.html
GetForegroundWindow
環境が無いので記憶頼りですいません。
WindowsAPIのGetForeGroundWindowで現在最前面にあるウィンドウのハンドルを取る事が出来ます。
1.タイマーか何かでGetForegroundWindowで現在アクティブな最前面のウィンドウハンドルを取得する。
2.自分が表示されたら取得を止める
3.コマンドボタンを押す
4.BringWindowToTopまたはSetForegroundWindowで直前までアクティブだったウィンドウを表示させる
5.文字列を送信する
やりたいことはこの流れで合っていますか?
文字列送信であれば、多少難ありですがSendKeysを使ってみてはいかがでしょう?
例)SendKeys ”password{enter}”, True
この例では password という文字列を送信してEnterキーを押します。
SendKeys strPass & ”{enter}”, true
などとすれば任意の文字列が送信出来ると思います。
的外れだったらごめんなさい。
ありがとうございます。
SendKeysは何かと問題がおおいそうです。
他の実現方法はないでしょうか?
連続回答で申し訳ありませんが、質問されてるようなのでお許し下さい。
まず、先程紹介したHPの[メモ帳を遠隔操作して遊ぼう]はすべて把握しましたか?
早くソフトを作成したい気持ちはとても良くわかるのですが、自分の知識以上の
物を作る時には、一見遠回りのようですがきちんと理解してから進んだ方が
結果的に早く完成しますよ。
その上での質問であればもう一度見直す事をお勧めします。
問題点1
先の回答でも少し触れましたが貼り付け先が最前面のウィンドウだと
限定してやると楽かもしれません。
先程紹介したURLの一番最後に「GetForegroundWindow」の解説がありますが、
これは最前面にあるウィンドウのハンドルを取得できます。
たとえば他アプリが最前面にあり、その上で自作ソフトを立ち上げたとすれば、
自作ソフトを最小化すれば他アプリが最前面に来ますね。つまり
GetForegroundWindowでハンドルが取得できるという事です。
親ウィンドウハンドルの取得にはGetWindow関数を使います。
また、先程紹介の二番目のサイトの過去ログに
[他アプリのテキストフィールドに文字を送るには?]
というのがありました。参考にして下さい。
問題点2
[メモ帳を遠隔操作して遊ぼう]の[6. 文字列を出力する]を参照して下さい。
任意の文字列を送れますね。
私はdelphi使いなので具体的なコードは示せませんが、やり方は一緒です。
一番難しいのは「どうやって目的のウィンドウハンドルを取得するか」だと思います。
ですから、とりあえず完成させたいのであれば一番目の回答者の言うように
クリップボード経由で貼り付けるのが一番簡単じゃないでしょうか。
もっと細かい事(詳細なコード等)を聞きたいのであればここではなく、
VB関係のHPの質問掲示板等で聞いた方が良いと思いますが、
とりあえず[メモ帳を遠隔操作して遊ぼう]の部分ぐらいは理解してから
質問しないと有効な回答は得られないかもしれません。
それでも具体的なコードを示してくれるのは難しいと思います。
紹介した2番目のHPの掲示板は比較的親切に回答が付く所だと思います。
APIリファンレス
クリップボード経由の例(GetForegroundWindow使用)
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200310/0310...
他アプリのテキストフィールドに文字を送るには?
他アプリのテキストフィールドに文字を送るには?
FindWindowEx
詳細なご回答、ありがとうございます。
このような質問であれば本来はその専門の掲示板等を利用すべきであることは
承知しているのですが、はてなの「即効性」を頼りにここに質問させていただきました。
なるべく多くの資料を参考にしたく、ご提示いただいたURLを全て把握する前に
次の回答を参照し、また失礼とは思いつつも思慮の浅い質問を重ねさせていただきました。
とりあえず目的の動作は実現することができたのですが、突貫工事のようなもので、
やっと動かすことができたというレベルのものですので、頂いた資料をもとに
考察を重ね、再度失礼な質問を繰り返さないように致します。
> 早くソフトを作成したい気持ちはとても良くわかるのですが、自分の知識以上の
> 物を作る時には、一見遠回りのようですがきちんと理解してから進んだ方が
> 結果的に早く完成しますよ。
> もっと細かい事(詳細なコード等)を聞きたいのであればここではなく、
> VB関係のHPの質問掲示板等で聞いた方が良いと思いますが、
> とりあえず[メモ帳を遠隔操作して遊ぼう]の部分ぐらいは理解してから
> 質問しないと有効な回答は得られないかもしれません。
> それでも具体的なコードを示してくれるのは難しいと思います。
そうですね。
必要があってすぐにこのようなプログラムをつくらなければならなかったのですが、
答え方の難しい、理不尽な質問であったと思います。
私自身、VBは初心者ですのでこれを機会に資料をよく読み、理解を深めたいと思います。
ありがとうございました。
この質問のためにまだ奔走してくださっている方がおられるかもしれませんので
もう少し、質問を継続したいと思います。
ありがとうございます。
大変参考になりました。
一応、上記の内容で、Command1ボタンを押すとメモ帳に
「aaaa」
という文字列を送信することができました。
しかし、下記のような問題点が残っています。
①メモ帳などとアプリを限定したくない(直前に操作していたあぷりにしたい)
②入力する内容はキーを押すことで実現するのではなく、任意の文字列(例えば配列の内容)としたい
どのようにすれば①、②を解決できるでしょうか?
Private Declare Function GetTickCount Lib ”kernel32” () As Long
Private Declare Sub keybd_event Lib ”user32.dll” _
(ByVal bVk As Byte, ByVal bScan As Byte, _
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
’仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067)
Private Declare Function MapVirtualKey Lib ”user32” _
Alias ”MapVirtualKeyA” (ByVal wCode As Long, _
ByVal wMapType As Long) As Long
Private Const VK_CAPITAL = &H14
Private Const VK_A = &H41
Private Const VK_TAB = &H9
Private Const VK_KANJI = &H19
Private Const VK_RETURN = &HD
Private Const VK_SHIFT = &H10
Private Const VK_HOME = &H24
Private Const VK_END = &H23
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
’キー送信をした後にちょっとまつ
Public Sub Waiter(TT As Long)
Dim T1 As Long, T2 As Long
T1 = GetTickCount()
Do Until T2 - T1 >= TT
T2 = GetTickCount()
DoEvents
Loop
End Sub
Private Sub Command1_Click()
Dim wVkKey() As Integer
Dim UpDown() As Integer
AppActivate ”無題 - メモ帳”
’a キーを押し、その後 Enter キーを押す
Call keybd_event(VK_A, 0, 0, 0)
Call Waiter(300)
Call keybd_event(VK_TAB, 0, 0, 0)
Call Waiter(300)
Call keybd_event(VK_A, 0, 0, 0)
Call Waiter(300)
Call keybd_event(VK_TAB, 0, 0, 0)
Call Waiter(300)
Call keybd_event(VK_A, 0, 0, 0)
Call Waiter(300)
Call keybd_event(VK_TAB, 0, 0, 0)
Call Waiter(300)
Call keybd_event(VK_A, 0, 0, 0)
Call Waiter(300)
End Sub