- ベストアンサー
【VB2008】 マウス操作の一時的無効化
いつも勉強させていただいています。 質問させていただきます。よろしくお願いします。 あるソフトのデータ保存を数分毎に行う必要がでてきたため、初めてVB2008で作成を試みました。SendKeysを知り、なんとか一連の保存作業(ソフトのツールバーのFile→SaveData→(ファイル名入力)→OK)を、自動化するところまでできたのですが、実行中にマウスポインタを動かしてしまうと正常に動作しなくなってしまうため、イベント中の5~10秒程度マウス操作を無効化したいのですが、やり方が見つかりません。 結構長い時間検索して試してみたのですが、 Cursor.Hide() や Private Sub Button1_MouseMove(・・・) Handles Button1.MouseMove Dim p As Point = New Point(0, 0) System.Windows.Forms.Cursor.Position = p End Sub のような都度ポインタを端に飛ばすような方法では、いくらでもアクティブウィンドウを切り替えられてしまうためうまくいきませんでした。 上のような「マウスが動いたときに都度発生~」といったような監視方法ではメインのイベントが妨げられるようにも感じますので、何かマウス操作を規制・無効にするよい方法がありましたら教えていただければと思います。 もしお詳しい方がいらっしゃいましたら、どうぞよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
vb6.0のソースですが参考になさってみてください。 Sendkeyでアプリケーションを操作して保存しているのですよね、SendkeyはOSの状態で正常にキャッチされない場合が発生したりあまりよい方法ではないと思います。 別の方法を検討されるのもひとつかと思います。
その他の回答 (3)
- AKARI0418
- ベストアンサー率67% (112/166)
スレッドを分けて処理するとか、バックグラウンドワーカーを使用して処理をして、イベントの影響を受けないようにしてみてはどうですか?
お礼
AKARI0418 様 どうもありがとうございました! バックグラウンドワーカーを使って(時間がかかりましたorz)、 あと紹介していただいたVB6のマウス固定コードも2008で動かせる ようになりました。始めてのVBでしたが、おかげさまで多くの事が 理解できました。自分で検索してコーディングするのは時間が かかりますねー。ここで御解答して下さるような方たちって 一体どうやって勉強してるんでしょうか???また悩むことが あったら教えてやってください。どうぞよろしくお願いします!
- AKARI0418
- ベストアンサー率67% (112/166)
#1さんの方法でよいならば、TopMostを設定しておけばアクティブウィンドウを切り替えられてしまうということはありません。 または
お礼
どうもありがとうございました! 目的のデータ解析ソフトからいくつかテキストを取れるように なりました。(まだ取れない部分もありますが...) 教えていただいたTopMostも設定してみましたが、まだデータ解析 ソフトを触れてしまうので、こちらにもEnabled=Falseする必要が あるようです。が、いまだに力不足でできませんorz 教えていただいたことをいろいろ調べているうちに、メモ帳に 文字を送受信したり目的の子ウィンドウからハンドルを取るくらいの ことはなんとかできるようになりましたので勉強になりました。 もう少し頑張ってみます。どうぞよろしくお願いします。
- st_comp
- ベストアンサー率41% (16/39)
コントロールを全て非アクティブ(enable=false)にするのではダメですか?
お礼
どうもありがとうございます! 検索して Me.Enabled = False で、メインフォームの方はやりたいことができました。アドバイスしてくださってどうもありがとうございます! 「あるソフト」については多分どうにかしてインスタンス化して(?)、同じように ~.Enabled = False だと考えて調べているのですが、やり方が分からず調べ続けております。検索結果のほとんどが AppActivate("ソフト名") → SendKeys,SendInput なので、自分が書こうとしているコードが易しいのか難しいのかすら検討がついておりません。 「外部アプリをインスタンス化」の方向でよろしいのでしょうか。。?
お礼
どうもありがとうございます!!! 御礼が遅くなりました。ご親切にご指摘くださいましてどうもありがとうございます。 ご提案してくださった通りSend~を使わないことが、本質問の根本解決手段なので ぜひ実行したく2005、2008のサンプルを探しておりましたが、 (かなりあるだろうと思ったんですが検索がへたなのか?)見つけるにいたっておりません。。 多分、見つけたFindWindow、FindWindowEx、SendMessage(?)あたりを使うのだと思うのですが。 できれば自分で解決してから御礼報告させていただくべきと考えていたので、 検索で比較的見つかりやすいVB6のサンプルを自力で治そうとトライしていましたが、 まだ理解できるにいたっておりません。 素人で申し訳ございませんが、もし2008のコードでそれっぽい考え方のページでもございましたら ご紹介いただけないでしょうか。。 どうぞよろしくお願いいたします。