はじめまして。
マウスを実際にはクリックしないで、クリックしたようにするにはどうしたら良いのでしょうか?
(キーボードを押した事にするのは、”SendKeys”ステートメントでなんとかいったのですが・・・)
なにぶん初心者なので、よろしくお願いします。
確か、このサイトのVBコーナーにある、APIサンプルにのっていたと思います。
たかみちえさん、返事ありがとうございます。
私も、APIサンプルのほうを調べてみたのですが、
マウスをワープ(?)させるのは見つけたのですが、
”クリックした事にする”って言うのは見つかりませんでした。
お手数ですが、もちっとヒント(サンプルの名前とか)をくれたら、ありがたいです。
なんか、教えてもらっているぶんざいで偉そうですが、気を悪くしないでくださいね。
APIの mouse_event を使えば良いと思います。
たしか、チェックボックスのスタイルを変えるとかのメッセージが紹介されているのと同じところにあったと思います。
ソースを見るとわかりますけど、その後ボタンをクリックするメッセージを送ってます。
それとも、ああいう感じとは違いますか?
"ボタンを"押し下げるメッセージのことなんですけど。
何度もお手数かけます。
たかみちえさん、あき☆彡さん、ありがとうございます。
>"ボタンを"押し下げるメッセージのことなんですけど。
ええと、私がやりたいのは、”VBで作ったアプリで、市販のソフトのボタンを自動で押したい”もうちょっと砕くと、”マウスの動きを記憶させて、再生させたい”って言うのが一番近いかな?
このページで例えるなら、手を離していても”追加発言ページ”の送信ボタンを押したいって事です。
Tabで、フォーカスを持っていこうともしましたが、そのソフトの押したいボタンへは、フォーカスも、ショートカットもききません。
そこで、マウスにボタンの座標を覚えさせて、(ここまでは出来ました。)クリックさせ・・・たいのですが、うまくいきません。
”ボタンを押し下げる”って言うのは、チェックボタンをBMPに変えるってやつですか?
それらしいものを探して見ましたが、どうも違うようです。お手数かけました。
”mouse_event ”も探してみましたが、私の目的を達成できそうなイベントなのですが、検索で調べる限り、C++の説明だったり、どんな宣言でどう使うかなどの情報がなかったため、いまいちよくわかりません。
出来れば、使い方の載ってるURLなどを教えてくれないでしょうか?
長くなってしまいましたが、よろしくお願いします。
mouse_eventはアクティブウィンドウに対しメッセージを
送りつけますから、mouse_eventを使うなら、
まずアクティブにする必要があります。
単に指定したソフトのボタンを自動でクリックしたことにしたいのなら、
そのボタンのhWndを取得して、WM_LBUTTONDOWN,WM_LBUTTONUP
あたりをSendMessageすればいいでしょう。
これならアクティブでなくても動作します。
そうではなく、「画面上のある座標をクリックしたら、たまたまその座標に
あるボタンをクリックしたことにしたい」のなら、
相当面倒なことになるでしょう。
たぶん、押したことにしたい座標をを取得し、
その座標に存在するウィンドウを調べ、
そのウィンドウ内のボタンウィンドウを調べ、
座標と重なるボタンウィンドウがあったら
そのボタンのhWndを調べ、hWndがわかったら
はじめてSendMessageできます。
そうではなく「マウス動作を記録したい」だけなら
グローバルフックして、「記録開始」から「記録終了」までの
マウス関連のメッセージを拾い上げればいいでしょう。
勿論、対象アプリのhWndは起動のたびに変化しますから、
記録したメッセージをそのまま再利用することはできません。
「記録開始」したときに、送りつけている相手のhWndから、
アプリを特定しておき、記録を再利用するときは、
まずそのアプリのウィンドウが存在しているかどうかチェックし、
存在していたらhwndを取得し、すげかえてやらねばなりません。
基本的に、APIはC/C++での使用を前提としています。
もっともいい資料はプラットフォームSDKと
VC++のヘッダファイルですが、VBを想定していません。
(特にVCのヘッダは、定数の値を知るのに重要です。)
また、APIのなかにはVBで利用可能なものと不可能なものがあります。
たとえば上記説明の「グローバルフック」はVBではできません。
即ち、APIを使いこなすにはC/C++の知識が不可欠ということです。
しかし宣言程度でしたら、若干の問題はありますがAPIビューアで調べられます。
また、VBでAPIを利用した簡単なサンプルなら
●vbvbvb.com
http://www.vbvbvb.com/jp/gtips/index.html
に1000以上ありますから、運がよければサンプルが見つかることもあります。
VBユーザ向けの一般的(でもないか・・・)なAPI解説記事は
●PCDN Visual Basic WorkGroup
http://www.int21.co.jp/pcdn/vb/
●Galliverテクニカルライティング
http://www.galliver.co.jp/writing/vbmagazine.html
にあります。APIについて理解を深めたいならどうぞ。
Sayさん、ありがとうございます。
>そうではなく、「画面上のある座標をクリックしたら、たまたまその座標に
>あるボタンをクリックしたことにしたい」のなら、
まさしくそれなんですが、私の場合、ボタンの位置にマウスをあわせるとこまでは、出来ています。
>そのボタンのhWndを調べ、hWndがわかったら
>はじめてSendMessageできます。
これが分かりません。(hWnd?)
WM_LBUTTONDOWN,WM_LBUTTONUPも、c++の説明しかないので、さっぱり・・・
やはり初心者には、無理なんでしょうかねぇ。
どうもいろいろお世話になりました。
諦めるにはちと早いので、
もうしばらくがんばって見たいと思います。
hWndはウィンドウハンドルです。
WindowsというOSは、ウィンドウという単位で、いろいろなコントロールを扱います。
フォームというのは、親ウィンドウで、コンボボックスやテキストボックスは、子ウィンドウ。
すべてにおいて、Windowsがそれを識別するための番号として、ウィンドウハンドルを持ってます。
(VBのラベルや、DelphiのTGraphicControl以下のコントロールなどは、例外でウィンドウを持っていません。
これは内部でとても苦労しているんでしょうけど、
デバイスコンテキストという、描画領域だけを作成して、それだけを使います。
なので、ウィンドウを持たないぶん、ほかのコントロールより軽いです)
hWndは、APIに"この識別番号を持ったウィンドウを操作して"という指示をするための数値です。
このSendMessageは、指定したハンドルを持っているウィンドウに、メッセージを送るものです。
> WM_LBUTTONDOWN
読んだままです。LBUTTON(マウスの左ボタン)を押し下げたときに送られるメッセージです。
UPのほうは、もうわかりますね?
Windowsは、ボタンの上で左ボタンを押したとき、ウィンドウに、このメッセージを送ります。
VBはそれを感知して、MouseDownイベントを発生させます。
メッセージを直接送ると…、わかりますよね?
ボタンはマウスの左ボタンがその上で押されたと思って、そのときの動作を行います。
たかみちえさん、何度もすいませんでした。
hWndが何なのかが、よく分かりました。
が、やっぱり、分かりません。(UPのしかたとか、”メッセージを直接送ると”の意味とか)もうちょっとAPIを勉強してから、また来たいと思います。
それでは。
では、補足説明。
SendMessageは、名前のとおり"メッセージを送る"APIです。
Windowsはウィンドウでコントロールを管理しているのは上に書きました。
それに加えて、それぞれのウィンドウに、適切なメッセージを送って、ウィンドウはそのメッセージに従う…という風にして動いています。
Windowsは、SendMessage(よく似たAPIで、PostMessageなどもあります。実際はほとんどこっちのほうを使ってるんでしょう(^^ゞ)をつかって、
いろいろなソフトを動かしています。
(APIというのは、Windowsが本来自分用に使っている関数を、
ほかのソフトが使えるようにDLLにしたものです)
わたしの言う"直接送る"というのは、SendMessageをソフトの作者が使って、
ソフトにマウスが押されたと思わせることです。
(紛らわしい言い方でごめんなさい^^;)
その後、本来の動作で、マウスの左ボタンが押された場合、当然その後ボタンを離します。
そのときに送られるのが、WM_LBUTTONUPです。
VBはそれを感知して、MouseUpイベントを発生させます。
同時に、ボタンならへっこんだボタンをもとに戻します。
(ボタンを元に戻すのはVBの動作ではなく、Windowsのボタンコントロール自体の動作です)
なんだか、どこかのホームページの〜講座みたいになってしまいましたね(^^ゞ
こんなことをしょっちゅう掲示板に書いてはいますけど、
自分のホームページには、そういうこと書いてないので…^^;
(以前はちょっと書いてたので、そのうちまた書こうかとは思ってますけど^^;)
sendmessageはAPIの中でもとりわけ動作が豊富なので、
調べようとすると結構苦労します。
で、簡単なサンプルをひとつ・・・。
Formにボタン1つおいて、以下のコードを貼り付けてください。
キーを押したときとボタンを押したときにほぼ同じ動作をします。
ボタンがへこまないのは、メッセージを送る前にシステムが行う処理だからです。
Option Explicit
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Sub Command1_Click()
'
End Sub
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.BackColor = vbRed
End Sub
Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.BackColor = &HC0C0C0
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Call SendMessage(Command1.hwnd, WM_LBUTTONDOWN, 0&, 0&)
End Sub
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Call SendMessage(Command1.hwnd, WM_LBUTTONUP, 0&, 0&)
End Sub
Private Sub Form_Load()
Me.KeyPreview = True
Me.AutoRedraw = True
Me.BackColor = &HC0C0C0
End Sub
この例では、同一Form内のボタンのhwndに対し、sendmessageしてます。
同一Formの場合、わざわざsendmessageしなくても、
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Call Command1_MouseDown(vbLeftButton, 0, 0, 0)
End Sub
のようにイベントプロシージャを直接呼べばいいので有り難みがないのですが、
hWndさえ取得できれば、相手はどんなアプリでも構わない、というところが
sendmessageを使う理由です。
じゃあどうやってhWndを取得するか?というと
まじめにやるにはEnumWindows使いますが、
コールバックの知識が必要になり、面倒です。
とりあえず、FindWindowとGetWindowを使って、
VBで自作した特定のアプリのhWndを拾う練習からはじめたらどうですか?
たかみちえさん、Sayさん、大変ありがとうございます。
Sayさんのサンプル、早速、試してみました。
なるほど、キーを押すのとマウスをクリックしたのと同じ反応をしますね。
ところで、>Private Const WM_LBUTTONDOWN = &H201
の”&H201”って何ですか?
あと、”FindWindowとGetWindow”は、”user32”のapiなのでしょうか?
APIビュー(ベクター等でも調べたのですがありませんでした。)がないので、よく分かりません。
お手数でなければ教えてください。
> &H201
16進数であることを示します。
・・・って、MSDNにも書いてあったような気がしますけど…(^^ゞ
知りたい単語の上にキャレット(編集カーソル)をのせて、F1を押すと大体ヘルプが出ます。
APIも一般的なものならいくつか、情報が載ってます。
MSDNのCDをいつも入れておくなり、インストールするなりして、いつでも見られる環境にしておきましょうね。
> FindWindow
user32.dllにはいっているAPIです。
VBでAPIを使うのは、APIビューアがないとほとんど無理です。
本やインターネットからの書き写しでは、限界があるので。
VB以外の言語では、ほとんどのAPIは大体最初から宣言されていますけど、
それでもこれのような一覧表がないとつらいです。
http://www.vector.co.jp/soft/win95/prog/se102484.html
VB付属のAPIビューアは使いづらいので、これを使っては?
http://www.vector.co.jp/soft/win95/prog/se117065.html
定義ファイルはこれ(VBにくっついていると思いますけど)。
ところで、失礼ですけど、どうやってしらべたんでしょうか?
ベクターの"ソフト検索"欄にそれを入れただけでも、結構見つかりますけど…(^_^;)
それと、ほかにもいろいろと必要なものがあると思うので、
ベクターの ダウンロード WIN のページ>プログラミング>
VisualBasicやツール、各種DLL、OCXなどで、
必要そうなものを準備しておくといいでしょう。
どうもあうーです。(毎回お礼を言っていると、なんか変に聞こえるから挨拶で失礼します。)
>MSDNのCD
って私のには最初からないんですよ。
なんせ、Version5.0ですから。
ですから、ベクターなどで、調べても、たいがいVer.6.0のソフトだったり、
SP2,3のものだったりするんですよ。しかも、アクティブXの”Microsoft Picture Clip Control5.0”もついていないようなやつです。
リンクを張っているソフト、Ver6.用みたいですけど、一度ためしてみます。
MSDNは、VBを買ったときの箱の中に入っていると思いますけど…。
入ってませんか?
VB6から添付なんて、そんなことはないと思いますけど…。
そしたら、MSDNを単体で買う(売ってるのかどうかわかりませんけど)か、
できるだけ幅広いことののっている本を買うかしかないですねぇ、
少なくとも最初のうちは、何かマニュアルに類するものがないと、ちょっとむりっぽいですよ。
ADSLなどの常時接続なら、オンラインMSDN(http://www.microsoft.com/japan/developer/library/default.asp)を常に表示させておく(もちろん、タブブラウザで)とかで、何とかなるかもしれませんけど。
あと、VB6専用のものはそうないと思います。いくつかコードの修正が必要な場合もありますけど、大体動くはずです。
バージョンによってOCXがないとか、そういうこともあまり聞いたことがないのですけど(VB5からVB6への変更点も、そんなに多くないそうなので)、
もしかして、Learning(Srtanderd)Editionでしょうか?
それだとしたらなおさら、OCXには頼れないので、APIをどんどんマスターしていく必要があります。
VB5では,MSDNじゃなくて,Books Onlineですね。
F1キーで出てくるのはWinHelp形式のヘルプですけど。
ちなみに,VB5とVB6でAPIに関連する事項は変わっていないです。
言語仕様では結構変わっていたりしますが。
どうも、あうーです。
やはり、参考書がないとつらいですね。
近いうちに本屋にでも行って探してきます。
>もしかして、Learning(Srtanderd)Editionでしょうか?
”Learning Edition”です。
なにせ、金欠なもんで。
YuOsannさん、返事ありがとうございます。
私の持っているのに付いているのは、”Books Online”です。
あれには、APIのことは殆ど書いていないので、なかなか苦労します。
>>もしかして、Learning(Srtanderd)Editionでしょうか?
>”Learning Edition”です。
>なにせ、金欠なもんで。
そうですかぁ…。
LearningEditionは、安いとはいっても、そのうちすごく大変になりそうなのです…。
最終的には、どれもほとんど同じですけど。
(OCXは結局使わないほうがいいことがわかるし…)
将来のことも考えて、少々無理したほうがよかったのですけど、
今言っても仕方ないですね。
VB5はもう売っていないと思うので、ずいぶん前から持っていると思うのですけど、
今ではフリーの開発環境もあるので、それを使うということも…。
・HSP…完全フリーの開発環境、ゲーム作成向き。ツールには向かない。
http://www.onionsoft.net/
・Delphi…バージョン6のPersonal(LerningEditionに相当するもの)版に限り無償配布。
Personal版とはいえ、フリーソフトを作る分には差し支えなく(有償ソフト作成不可)、コンポーネント(部品)も豊富。
Delphiユーザーのサイトなどでダウンロードできる自作コンポーネントも、大体使える。
・BorlandCCompiler…コマンドラインコンパイラ。C言語なので文字列処理には向かない。
http://www.borland.co.jp/
HSPをのぞき、APIはあらかじめ宣言されています。
Delphi6は、APIのマニュアルは同じくまったくありませんけど、じっさい自分でAPIを呼び出さないといけない機会は、そうありません。
うちにもちょっとしたモジュールがおいてあります。
>YuOさん
ありがとうございます。VB5との違いは実は、MSDNの先頭に書いてあったのを読んだ位しかしらなかったので、
とても助かりました。
> あれには、APIのことは殆ど書いていないので、なかなか苦労します。
VS97系の場合,APIの情報を入手するにはVC++ 5.0をインストールする必要があります。
諦めて,MSDN Onlineを参照しましょう。
#ど〜せVC++ 5.0は英語だし6.0は誤訳多いし。
どうも、あうーです。
はぁー、フリーの開発環境もいろいろあるんですねぇ。
まだ私は、VBを使いこなせていないので、まず、これを使えるようになったら、
次のソフトに手を出したいと思います。(途中でやめると”辞め癖”がつきますから。)
ツイート | ![]() |