'Alt+z'キーを押しながらマウスのドラッグを制御する方法

このQ&Aのポイント
  • VBで'Alt+z'キーを押しながらマウスのドラッグを制御するのがうまくいかなくて困っています。
  • 実行すると実際には各ボタンは押されているようなのですが、手動でやるような動作をしないのです。
  • どこか、問題個所はありますでしょうか?ご教授お願い致します。
回答を見る
  • ベストアンサー

'Alt+z'キーを押しながらマウスのドラッグを制御する方法

お世話になっております。 VBで'Alt+z'キーを押しながらマウスのドラッグを制御するのがうまくいかなくて困っています。 実行すると実際には各ボタンは押されているようなのですが、手動でやるような動作をしないのです。 どこか、問題個所はありますでしょうか?ご教授お願い致します。 Private Const VK_Z = 90 'Zキー Private Const MOUSE_MOVED = &H1 Private Const MOUSEEVENTF_LEFTUP = &H4 '左ボタンUP Private Const MOUSEEVENTF_LEFTDOWN = &H2 Call keybd_event(&H12, 0, 0, 0)'Altキー押下 Call keybd_event(VK_Z, 0, 0, 0)'Zキー押下 Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) 'マウス左ボタン Call mouse_event(MOUSE_MOVED, ax, ay, 0, 0) 'ボタンを押したまま移動 Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) 'ボタンを解除

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

VB6、Win2000で、デスクトップのアイコンを使って確認しましたが、特に問題なく動いているように見ます。 #Zキーは押されてなくても関係ない確認になっちゃってますが。 >VBで'Alt+z'キーを押しながらマウスのドラッグを制御するのがうまくいかなくて困っています。 > >実行すると実際には各ボタンは押されているようなのですが、手動でやるような動作をしないのです。 どんな動作をさせようとしているのでしょうか?Alt+Zのドラッグって標準では無いかと思うのですが。 >KEEVENTF_UPは2つのキーを押したままで >ドラッグしたいので、必要ないと思いますが >いかがでしょうか? あとからちゃんとUPしとかないと、ALTキーが押されっぱなしの状態になってるので、思いもしない動作をするかもしれません。 やりっぱなしはまずいですということですね。

naoki5252
質問者

補足

ご返信遅くなり大変申し訳ありません。 ALT+Zはあるビデオボードの制御で必要なんです。 KeyUpしてもうまくいかないです。 やっぱり無理なのでしょうか? お手数かけますが、よろしくお願いいたします。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>クリックする座標はマウスのある場所で大丈夫ですので、 >このままで大丈夫だと思います。 確認なのですが、このプログラムというか、この箇所のコードはどのように実行しているのでしょうか? あとは、axとayの指定している値は正しいものが入っていますか? あと、keybd_eventでKEYEVENTF_KEYUPを指定している所が無いのは平気ですか?

naoki5252
質問者

補足

度々ありがとうございます。 プログラム自体はデスクトップ上のある座標に SetCusorPositonでマウスをセットし、 そこで2つのキーを押しながら、ドラッグするというものです。 ちなみに Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) の前までプログラムを実行するろ2つのキーが 押した状態になり、手動でドラッグすると、 2つのキーを押した状態でドラッグできます。 KEEVENTF_UPは2つのキーを押したままで ドラッグしたいので、必要ないと思いますが いかがでしょうか? ax,ayの値は思ったとおりにマウスが移動しますので、 特に問題ないと思います。 よろしくお願いいたします。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) の座標の指定が無い。

naoki5252
質問者

補足

taka_tesu様 ありがとうございます。 クリックする座標はマウスのある場所で大丈夫ですので、 このままで大丈夫だと思います。

関連するQ&A

  • キーを押しながらマウスをドラッグする動作を制御する方法

    お世話になっております。 VBで'Alt+z'キーを押しながらマウスのドラッグを制御するのがうまくいかなくて困っています。 実行すると実際には各ボタンは押されているようなのですが、手動でやるような動作をしないのです。 ちなみに (1)のCall mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) の前までプログラムを実行すると2つのキーが 押した状態になり、手動でドラッグすると、 2つのキーを押した状態でドラッグできます。 mouse_eventでキーのイベントをキャンセルしてるようです。 どこか、問題個所はありますでしょうか?ご教授お願い致します。 Private Const VK_Z = 90 'Zキー Private Const MOUSE_MOVED = &H1 Private Const MOUSEEVENTF_LEFTUP = &H4 '左ボタンUP Private Const MOUSEEVENTF_LEFTDOWN = &H2 Call keybd_event(&H12, 0, 0, 0)'Altキー押下 Call keybd_event(VK_Z, 0, 0, 0)'Zキー押下 Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)・・・(1) 'マウス左ボタン Call mouse_event(MOUSE_MOVED, ax, ay, 0, 0) 'ボタンを押したまま移動 Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) 'ボタンを解除

  • Ctrl+Vのキーストロークを合成したいのですが

    Ctrl+Vのキーストロークを合成して、クリップボードの内容を貼り付けたいと考えています。 いろいろ調べた結果、大体以下のように記述すればよいのではないかとおもったのですが記述に間違いがあるようです。(form上のText1内に張り付けることができません。)恐れ入りますが、何卒ご教授いただきたくお願いいたします。 Option Explicit Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _ ByVal bScan As Byte, _ ByVal dwFlags As Long, _ ByVal dwExtraInfo As Long) Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Const VK_CONTROL = &H11 Private Sub Command1_Click() Call keybd_event(VK_CONTROL, 0, 0, 0) Call keybd_event(Asc("V"), 0, 0, 0) Call keybd_event(Asc("V"), 0, KEYEVENTF_KEYUP, 0) Call keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0) End Sub ちなみに使用目的につきましては、form1上のWebBrowser1に開いた入力フォームの<input type="file" >に(JavaScriptでフォーカスを移したうえで)ファイルのパスを貼り付けることです。 <input type="file" >はvalueを指定できないようなので、色々考えた結果、上記のようにするしかないかと考えました。もしもほかによい方法があったら恐れ入りますがご教授いただけると大変ありがたいです。よろしくお願いします。

  • Windows7-VB6でのアクティブウィンドウキャプチャ

    Windows7-VB6でのアクティブウィンドウキャプチャ お世話になります。 Private Declare Sub keybd_event Lib "User32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Const VK_LMENU = &HA4 Private Const VK_SNAPSHOT = &H2C Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Command1.SetFocus DoEvents Load form2 Clipboard.Clear keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0 keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0 DoEvents keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 ※form2.picPrint.Picture = Clipboard.GetData() 上記コードはWinXPであれば問題なく動作するのですが Win7ではform2のピクチャボックスにイメージが貼り付けられません ※行にブレイクを入れて、一旦プログラムを停止し再開するとOKで その他にもALTキーの送信をしないでprtscrのみでも動作可能です。 win7-vb6でアクティブウィンドウのキャプチャを クリップボードを使用し、フォームのピクチャボックスに貼り付けることは 可能でしょうか

  • VB6で他のアプリへ左右のCTRLキーを送る方法

    先に「Excel VBA で CTRLキーを送る方法」と題して質問したものです。 VB6でSendInputを使うアドバイスを頂きCTRLを送ることが出来たので解決したと思っていましたが、左右のキーの判断が出来ていないようです。 下記のコードを実行形式にしてたとき、引数の如何にかかわらず、受け取る側(YourAppli.ws)では右のCTRLを受け取った動作をします。左のCTRL(Zキーに近い方)を受け取った動作をしてくれません。 アプリケーションに左右のCTRLを認識させる方法をご教示お願いします。 コードの作成は http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendinput/​を参考に致しました。 Option Explicit Private Type KEYBDINPUT wVk As Integer wScan As Integer dwFlags As Long time As Long dwExtraInfo As Long no_use1 As Long no_use2 As Long End Type Private Type INPUT_TYPE dwType As Long xi As KEYBDINPUT End Type '仮想キーコード Private Const KEYEVENTF_KEYUP = &H2 'キーアップ Private Const KEYEVENTF_EXTENDEDKEY = &H1 'スキャンコードは拡張コード Private Const INPUT_KEYBOARD = 1 '入力タイプ:キーボード Private Const VK_CTRL = &H11 'Contorol Private Const VK_LCONTROL = &HA2 'Left_Contorol Private Const VK_RCONTROL = &HA3 'Right_Contorol Private Const VK_RETURN = &HD 'Right_Contorol Private Const KEY_DOWN = 0 'キー押し下げ Private Const KEY_UP = 1 'キーアップ '仮想キーコード・ASCII値・スキャンコード間でコードを変換する Private Declare Function MapVirtualKey Lib "user32" _ Alias "MapVirtualKeyA" (ByVal wCode As Long, _ ByVal wMapType As Long) As Long 'キーストローク、マウスの動作、ボタンのクリックをシミュレートする Private Declare Function SendInput Lib "user32.dll" _ (ByVal nInputs As Long, pInputs As INPUT_TYPE, _ ByVal cbsize As Long) As Long ' 指定時間Wait(ミリ秒) Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub Main() Const AppID = "YourAppli.ws" Dim i As Integer AppActivate AppID Select Case Command Case "L", "l" Send_LCtrl Case "R", "r" Send_RCtrl Case "" Send_Ctrl Case Else MsgBox ("Error") End Select Sleep 50 End Sub Private Sub Send_LCtrl() Call KeyEvent(VK_LCONTROL, KEY_DOWN) Call KeyEvent(VK_LCONTROL, KEY_UP) End Sub Private Sub Send_RCtrl() Call KeyEvent(VK_RCONTROL, KEY_DOWN) Call KeyEvent(VK_RCONTROL, KEY_UP) End Sub Private Sub Send_Ctrl() Call KeyEvent(VK_CTRL, KEY_DOWN) Call KeyEvent(VK_CTRL, KEY_UP) End Sub Sub KeyEvent(VkKey As Integer, UpDown As Integer) ' VkKey:仮想キーコード ' UpDown:動作(KEY_DOWN/KEY_UP) ' Dim inputevents As INPUT_TYPE With inputevents .dwType = INPUT_KEYBOARD With .xi .wVk = VkKey '操作キーコード .wScan = MapVirtualKey(VkKey, 0) 'スキャンコード If UpDown = KEY_DOWN Then 'キーDown .dwFlags = KEYEVENTF_EXTENDEDKEY Or 0 Else 'キーUP .dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP End If .time = 0 .dwExtraInfo = 0 End With End With Call SendInput(1, inputevents, Len(inputevents)) End Sub

  • ALTキーが押しっぱなしと認識する不具合

    マウスの左ボタンでアイコンをクリックするとプロパティが開きます。 一応、再起動やAltキーを何回か押下すると治ったりするのですが、この症状が頻繁になってきました。 調べたところ、Altキーが何らかの原因で押しっぱなしと認識しているとのことで、固定キーの解除のチェックも外しました。それでも治らず、クリーンインストールも試したのですがやはり同様の現象が起きてしまいます。 キーボードの故障でしょうか? 特に症状が出やすいのはシャットダウン後、長時間のスリープ後です。 どなたかお知恵をお貸しください。 宜しくお願いします。

  • Excel VBA によるマウス操作

    こんばんは。 まず以下のコードをご覧ください。 Public Declare Sub mouse_event Lib "user32.dll" _ (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, _ ByVal dwData As Long, ByVal dwExtraInfo As Long) Public Const MOUSEEVENTF_ABSOLUTE = &H8000& Public Const MOUSEEVENTF_MOVE = &H1 Public Const MOUSEEVENTF_LEFTDOWN = &H2 Public Const MOUSEEVENTF_LEFTUP = &H4 Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 Public Const MOUSEEVENTF_MIDDLEUP = &H40 Public Const MOUSEEVENTF_RIGHTUP = &H10 Public Const MOUSEEVENTF_RIGHTDOWN = &H8 Sub test() Call mouse_event(MOUSEEVENTF_ABSOLUTE, 10, 65500, 0, 0) Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) End Sub ExcelでSub test()を実行し、マウスで画面の左下の「スタート」を左クリックしたのと同じ結果が出ればいいのですが、うまくいきません。 フォームボタンで実行したらしばらくポインターが点滅していました。 クリックはされているようですが、移動ができてないようです。 このAPI関数というものが、このカテゴリーでよいのかも分からない私ですが、どうかご回答よろしくお願いします。

  • buttonを使用したtextboxへの入力について

    こんにちは、初めて投稿させていただきます。 現在VB2005を勉強しています。 ボタンを押すとtextboxに文字が入力されるというものを作成しているのですがひらがなを漢字に変換した際、次の文字を打とうとすると2文字目を入力した際に変換した文字が消えてしまいます。 このような具合です。 「きょうは」と打ち、変換して「今日は」にした後「はれ」と打とうとすると「れ」を入力した際に「今日は」が消えて「はれ」だけになってしまいます。 何処がいけないのかまったくわからない状況で困っています。 ボタンの設定は下記のようにkeybd_eventでそれぞれ行っています。 Private Sub ExButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExButton1.Click TextBox4.Focus() 'Aを押す TextBox4.Text = "" TextBox4.Focus() Call keybd_event(VK_A, 0, 0, 0) Call keybd_event(VK_A, 0, KEYEVENTF_KEYUP, 0) End Sub

  • NumLockの制御について

    VB5.0(SP3)で次のプログラムを作成しました。 キーボードからNumLockキーを押して状態をOFFにすると、プログラム側(タイマー関数内)でその状態をチェックし、状態をONに戻します。 しかし、次の動作をした時に問題が発生しました。 但し、この問題は、OSがWindowsNT4.0(SP6)の端末で発生するのですが、Windows2000/XP では発生しませんでした。 起動したフォーム画面にフォーカスがある間は問題ないのですが、フォーカスを外した状態でNumLockキーを押して状態をOFFにすると、ON/OFFが繰り返されてしまいます。 この時に、マウスをフォーム画面の上に持ってくるとその繰返し処理が止まります。 もちろん再度 NumLockキーを押しても止まります。 OSの問題なのでしょうか?それともプログラムが悪いのでしょうか? 下記にそのプログラムを表記します。 <プログラム> フォーム(Form1)にタイマー(Timer1)を貼りつけただけです。 (Module1.bas) Option Explicit Public Const VK_NUMLOCK = &H90 Public Const KEYEVENTF_KEYUP = &H2 Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _                        ByVal bScan As Byte, _                        ByVal dwFlags As Long, _                        ByVal dwExtraInfo As Long) (Form1.frm) Option Explicit Private Sub Form_Load()   Timer1.Interval = 100 End Sub Private Sub Timer1_Timer()   On Error Resume Next   If GetKeyState(VK_NUMLOCK) = 0 Then     keybd_event VK_NUMLOCK, 0, 0, 0     keybd_event VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0   End If End Sub

  • 画面ハードコピーのプログラム

     お世話になります。  株チャートの動きを確認する為、ボタンをクリックすると、モニタに映ってるモノ全体が、瞬時に、BMPで保存されるというプログラムを作ってます。 キーボードの PrtScSysRq を押して、エクセルなどに貼付け保存という手作業をエクセルではなく BMP に置き換えて保存という事です。  過去の類似質問を見てみますと、「ピクチャーボックスの画像を保存」はありましたが、「モニタの画像」は見当たらず、グーグルなどで検索して、ムリヤリ作ってみました。下記参照。  しかし、実際動かしてみると、「名前がついて保存されてるが何も映っていない」「瞬時ではなく、30秒~2分くらい前の画像が保存される」という不具合になってます。    この場合の正しいプログラムを教えて欲しいです。  御教授御願いします。 form1 に .Command1 .Picture1 を貼り付けます。 Private Type tagKEYBDINPUT wVk As Integer wScan As Integer dwFlags As Long time As Long dwExtraInfo As Long bytUnusedPadding(7) As Byte End Type Private Type tagINPUT type As Long ki As tagKEYBDINPUT End Type Private Const INPUT_KEYBOARD = 1 Private Const VK_LMENU = &HA4& Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As tagINPUT, ByVal cbSize As Long) 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) Private Const VK_SNAPSHOT = &H2C Private Const KEYEVENTF_KEYUP = &H2 Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private IYI As String, G_CC As Integer Private Sub Command1_Click() G_CC = G_CC + 1 Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0) Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) Picture1.Picture = Clipboard.GetData IYI = "C:\test\" & G_CC & "_SAMP.BMP" Call SavePicture(Picture1.Image, IYI) Clipboard.Clear End Sub Private Sub Form_Load() With Me .ScaleMode = vbPixels With .Picture1 .Appearance = 0 .AutoRedraw = True .AutoSize = True .BorderStyle = 0 .Visible = False End With End With G_CC = 0 End Sub

  • ファイル入力画面からファイル名を入れて継続して動作

    excel vbaで、他のEXCELファイルのマクロの処理を中断して、自己ファイルのマクロを処理後、再度他のEXCELファイルのマクロを継続して再度処理を行わせるにはどうすれば良いですか。教えて下さい 他のEXCELファイルとして、フリーソフトを利用しています。 そのソフトは、モジュールにロックが掛ってるので、その中のマクロなどを編集することはできません。(ロック解除などは考えていません。) そのソフトを起動して、データファイル入力画面で、データファイルを入力して、処理をして、処理結果を保存することを、入力データファイルを変えながら、繰り返し行いたいです。 そこで、処理マクロを作成しています。その手順とVBAを説明します。 1)フリーソフトを開き、 2)そのフリーソフトのシート内のボタンを、VBAで、マウスカーソルを移動させて、マウスのキー操作で、「押す」「離す」を行い、 3)ファイルの初期化の問合せの警告が出るので、キー操作で、「Y」を押し、 4)データファイルの名称をクリップボードにコピーし 5)EXCELのカレントフォルダを、データファイルのあるフォルダに変えて 6)DoEventsとして、フリーソフトのデータファイル入力画面を開いています。 この時、画面のポインタは、データ入力画面のファイル名入力欄にあり、 この後、データファイル名をクリップボードから入力したいので、 キー操作で、「crtl+v」としたいのですが フリーソフトのマクロが起動中で、作成している処理マクロに制御が移らないためと思いますが 入力できません。(人手での入力は可能ですが)、自動化したいので、どの様にすれば良いか教えて下さい。 マクロは長いので、抜粋して記載します。 sub a() (宣言文省略します。) Workbooks.Open freesoft Dim mPSet As Long mPSet = SetCursorPos(b,c) Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) keybd_event VK_Y, 0, fKEYDOWN, 0 keybd_event VK_Y, 0, fKEYUP, 0 Application.CutCopyMode = False Dim d As New DataObject With d .SetText e .PutInClipboard End With ChDrive f ChDir g DoEvents (ここで、止まります。) With d .GetFromClipboard .GetText End With keybd_event VK_RETURN, 0, fKEYDOWN, 0 keybd_event VK_RETURN, 0, fKEYUP, 0 DoEvents Dim mPSet2 As Long mPSet2 = SetCursorPos(h, i) Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) Workbooks(freesoft).SaveAs FileFormat:=xlNormal, Filename:=k Workbooks(k).Close End sub