• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB6で他のアプリへ左右のCTRLキーを送る方法)

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

noname#259269の回答

noname#259269
noname#259269
回答No.1

こんにちは。少し確認点を。 1.wScan の値は左右で違う値に変換されていますか? 以前私が紹介した英語のサイト、ほぼそのまま入力してこちらでは動きました。VB6での掲載ソースとの違いを言うと、wScan = 0 固定でした。つまり MapVirtualKey は利用していません。 2.また送信対象のプログラムは信用できますか? 一応 VB6 で、右Ctrlと左Ctrlのキー入力を検知するソースを載せておきますので、これを使って実際にあなたが作成したプログラムから左右のCtrlが正しくキー送信されているか確認してみてください。 --- Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Dim k(255) As Byte If Shift = 2 Then GetKeyboardState k(0) If CBool(k(&HA2) And &H80) Then Me.Label1.Caption = "Left Ctrl Key" Else If CBool(k(&HA3) And &H80) Then Me.Label1.Caption = "Right Ctrl Key" End If End If Else Me.Label1.Caption = "" End If End Sub Private Sub Form_Load() Me.KeyPreview = True End Sub #フォームにラベルを一つ貼り、ますば手操作で検知できる事を確認して使ってください。

mana_okwav
質問者

お礼

edp3142さん ご提供頂いたコードで試して見ました。 当方で作成したコードからは、左キーを送ったつもりでも右キーが受信されました。 提供頂いたコードは大変役に立ち、問題点が絞れてきました。 http://www.pinvoke.net/default.aspx/user32.SendInput を読み解かなければならないのでしょうが、基礎がないため内容が理解できません。

mana_okwav
質問者

補足

edp3142さん ご親切に評価用コードを提供頂きありがとうございます。 3連休中に試してみます。 現在分りましたことは以下です。 それにしても、左キーではなく、右キーを入れたときと同じ動作となるのも変です。 > 1.wScan の値は左右で違う値に変換されていますか? VkKey=VK_LCONTROL、VkKey=VK_RCONTROLのいづれでも &H1Dです。 wScan = 0 に固定しても結果は同じでした。(右キーのシュミレートとなる) > 2.また送信対象のプログラムは信用できますか? 長年使用しているもので、大手の製品です。  左コントロールは入力エラーなどが発生たときの回復に使用するようになっています。手でキーを操作すると問題なく動作します。

関連するQ&A

  • 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を指定できないようなので、色々考えた結果、上記のようにするしかないかと考えました。もしもほかによい方法があったら恐れ入りますがご教授いただけると大変ありがたいです。よろしくお願いします。

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

     お世話になります。  株チャートの動きを確認する為、ボタンをクリックすると、モニタに映ってるモノ全体が、瞬時に、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

  • 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でアクティブウィンドウのキャプチャを クリップボードを使用し、フォームのピクチャボックスに貼り付けることは 可能でしょうか

  • 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

  • '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) 'ボタンを解除

  • VB6でWindows2003 Serveの画面ハードコピーを取るには

    VB6で画面のハードコピーを取るのに下記のような関数を作成して動作させています。 今回、windows 2003 Serverで初めて使用したのですが、エラーが出力されます。 Public Sub xxxxxx()  Dim OsVer As Single  Clipboard.Clear  OsVer = CreateObject("SysInfo.SYSINFO").OSVersion   If OsVer < 5 Then  '画面全体のスナップショットを取得する(Win98SE/Win95)    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY, 0)    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) Else    '画面全体のスナップショットを取得する(WinXP)    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0)    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)  End If End Sub エラーの内容は ErrNO=429 ActiveX コンポーネントはオブジェクトを作成できません。 と言うエラーなのですが、2003 serverではkeybd_eventの使い方がXp等と違うのでしょうか? 何処が悪いのかおわかりの方ご教示頂けないでしょうか? 宜しくお願いいたします。

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

    お世話になっております。 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) 'ボタンを解除

  • VBを使ってのCD-RWへのバックアップ方法を教えてください。

    こんにちは。よろしくお願いします。 VB5を使って開発しています。 パソコンの環境はWindowsXP(SP2)、データはAccess2003のMDBデータとスキャナで取り込んだ画像ファイルです。 上記2データをCD-RWにバックアップする処理をフォーム上のコマンドボタンを押して実行したいと考えています。 いろいろなサイトなどを探してみてFilecopyやSHFileOperationといったコピーの方法があると知りどちらも試してみたのですが、うまくいきません。間違っている箇所すらわからない状態です。CD-RWにバックアップを取ることは不可能なのでしょうか。また正しい方法が別に存在するのでしょうか。ご指摘、アドバイスをお願いいたします。 下は実際に作った処理です。 ----------------------------------------------------- Filecopy "D:\data\*.*","E:\back\*.*" ------------------------------------------------------ Private Declare Function SHFileOperation Lib "shell32" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long Private Type SHFILEOPSTRUCT hwnd As Long wFunc As Long pFrom As String pTo As String fFlags As Integer fAnyOperationsAborted As Long hNameMappings As Long lpszProgressTitle As String End Type Private Const FO_COPY = &H2 Private Const FO_DELETE = &H3 Private Const FO_MOVE = &H1 Private Const FO_RENAME = &H4 Private Sub Command1_Click() Dim Ret As Long Dim sf As SHFILEOPSTRUCT sf.hwnd = Me.hwnd sf.wFunc = FO_COPY sf.pFrom = "D:\data\*" sf.pTo = "E:\back\" Ret = SHFileOperation(sf) If Ret <> 0 Then MsgBox "失敗しました。" End Sub

  • (VB6)MDI親FormのPictureプロパティの設定方法

    MDIの親フォームのPictureプロパティに、コードで画像を貼りつけて、表示領域に全画面表示させたいのですが、できません。 MDIの親フォームでなければ、PaintPictureを使えるというのは調べましたが、MDIの親フォームではどのようにすればいいのでしょうか。 public Declare Function RedrawWindow Lib "user32" (ByVal hWnd As Long, lprcUpdate As Any, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long Public Const RDW_ALLCHILDREN = &H80 Public Const RDW_ERASE = &H4 Public Const RDW_INVALIDATE = &H1 Public Const RDW_UPDATENOW = &H100Private Sub Command1_Click() Me.Picture = LoadPicture("C:\pic\aa.jpg") Call RedrawWindow(Me.hWnd, ByVal 0&, 0&, RDW_ERASE Or _ RDW_INVALIDATE Or RDW_ALLCHILDREN Or RDW_UPDATENOW) End Sub

  • キー入力を制限しつつ、Ctrl+CやCtrl+Vを活かすには?

    数字とバックスペース以外入力できないテキストボックスTextBoxAを作りました。 Private Sub TextBoxA_KeyPress(KeyAscii As Integer) If KeyAscii <> vbKeyBack Then If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 End If End If End Sub と記述しましたが、Ctrl+CやCtrl+Vが効きません。 右クリックでコピー、ペーストはできるのですが、コントロールキー によるコピペを可能にするにはどうしたらいいでしょうか? どなたかよろしくお願いします。