tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルキー入力をコードでする方法
記事No14312
投稿日: 2009/12/14(Mon) 15:42
投稿者さくら
VB6.0を使用しているかなりの初心者の私です。

過去ログも色々検索してみましたが、
検索方法も未熟なのもあり、解決出来ませんでした。

【質問内容】
コマンドボタンが押されたときに、
キーボードで『F5』キーを押した状態と
同じ動作をコードから行いたいのですが、
方法がよく分かりません。

KeyPress、KeyDown、KeyUpは違うようですし、
近いか分かりませんが、『VbKeyF15』と言う
キーワードまではたどり着いたのですが、
使用方法が・・・

基本的な事かも知れず、お恥ずかしいですが
御教授の程、宜しくお願い致します。

[ツリー表示へ]
タイトルRe: キー入力をコードでする方法
記事No14313
投稿日: 2009/12/14(Mon) 16:11
投稿者花ちゃん
> コマンドボタンが押されたときに、
> キーボードで『F5』キーを押した状態と
> 同じ動作をコードから行いたいのですが、
> 方法がよく分かりません。

一番簡単な方法(但し、OS等によっては動作が不安定)
Private Sub Command1_Click()
   SendKeys "{F5}"
End Sub

高度な方法(ここの逆引きヘルプのキーストロークをシミュレートする)

http://www.hanatyan.sakura.ne.jp/vbhlp/keyevent.htm
http://www.hanatyan.sakura.ne.jp/vbhlp/SendInput.htm

[ツリー表示へ]
タイトルRe^2: キー入力をコードでする方法
記事No14315
投稿日: 2009/12/14(Mon) 17:34
投稿者さくら
花ちゃんさま

早急の御教授ありがとう御座います。
試させて頂きます。
(因みにOSはXPです。)

高度な方法も勉強させて頂きます。

何せ初心者なので、理解するのに少々
お時間が掛かりそうなため、まずはお礼まで・・・

ありがとうございます。

[ツリー表示へ]
タイトルRe^3: キー入力をコードでする方法
記事No14317
投稿日: 2009/12/14(Mon) 18:05
投稿者さくら
花ちゃんさま

かなり説明不足で申し訳ありませんでした。

現在、コマンドボタンを押した後、タイマーを回して一定時間ごとに
URLを更新する処理を行おうとしています。
(最初の何も立ち上がっていない状態では、IEが起動しその後一定時間
 が経つごとに、更新はされるのですが、表示されている位置(IE内の表示)
 がズレてしまって困っていました。
 位置を記憶する方法もあるのかも知れませんが、何せ初心者なもので、
 F5キーの更新ですと位置がズレないで更新出来たため・・・
 因みに、現在は他のアプリケーションがアクティブで、IEが隠れている
 時も、処理を行ってくれいます。←理想です。)

説明不足でしたので、追記させて頂きました。
(度々済みません。)

因みに、タイマーで一定時間が経つ毎に

Call Y_Exec(1, URL, "", "", SW_SHOWNORMAL)

で、任意のURLの処理を行っています。

Public Sub Y_Exec(hWnd As Long, FilePath As String, parameter As String, _
WorkPath As String, WindowSize As Long)

     Dim longret As Long
     Dim msg As String

     longret = ShellExecute(hWnd, "Open", FilePath, parameter, WorkPath,_
               WindowSize)

     If longret < 31 Then
         Select Case longret
             Case 0
                 msg = "メモリ不足です。"
             Case ERROR_FILE_NOT_FOUND
                 msg = "ファイルが見つかりません。"
             Case ERROR_PATH_NOT_FOUND
                 msg = "ファイルのパスが見つかりません。"
             Case Else
                 msg = longret & "その他のエラー"
         End Select
         Call MsgBox(msg, 16)
     End If

End Sub

[ツリー表示へ]
タイトルRe^2: キー入力をコードでする方法
記事No14320
投稿日: 2009/12/15(Tue) 13:15
投稿者さくら
花ちゃんさま

SendKeys ステートメント確認しました。
OSはXPですが、問題なく動作しました♪

そのような命令があるとは知りませんでした。
今後、外のキーなどにも色々と応用ができそうです。

御教授ありがとう御座いました。

[ツリー表示へ]
タイトルRe: キー入力をコードでする方法
記事No14314
投稿日: 2009/12/14(Mon) 16:35
投稿者魔界の仮面弁士
> 『VbKeyF15』と言う
それは F5 ではなく、F15 です。


> キーボードで『F5』キーを押した状態と
> 同じ動作をコードから行いたいのですが、
F5 押下を、他のアプリケーションに通知したいのでしょうか。
それとも、自アプリに対して通知したいのでしょうか。
また、そもそも何のために F5 を押した状態にしたいのでしょうか?


たとえば、自フォームについて
 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyF5 Then
   '何かの処理
  End If
 End Sub
という処理が記述されていて、これをボタンクリック時にも発生させたいのなら、
F5 キーの押下を擬似的に発生させるよりも、
 Private Sub Foo()
  '何かの処理
 End Sub

 Private Sub Command1_Click()
  Foo
 End Sub

 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyF5 Then
   Foo
  End If
 End Sub
のような実装にした方が良いかと思います。



> 方法がよく分かりません。
このサイトの左フレームから、[VB6.0関係]-[カテゴリ別一覧]-[その他] にある
  『キーストロークをシミュレート(押下げ・制御)する(SendInput関数使用)』
を辿ってみてください。  http://hanatyan.sakura.ne.jp/index.html


ただし、この方法(SendInput)で擬似的に発生させたキー入力という物は、
あくまでも「その時点におけるフォアグラウンドウィンドウ」が受け取ります。
ウィンドウ切り替えが発生するなどして、処理のタイミングがずれると、その通知が
目的のアプリケーションに受け取られるとは限らないという点に注意してください。

SendInput 以外の方法としては、アプリケーションに特化したウィンドウメッセージを
API (SendMessage/PostMessage)で生成する方法があります。たとえば、
 PostMessage Text1.hWnd, WM_KEYDOWN, vbKeyF5, ByVal 0&
という操作を行うと、フォーカスが Text1 に無い時であっても、
 Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
  Debug.Print KeyCode
 End Sub
にて、vbKeyF5(=116) が押下されたかのように受け取らせる事ができます。

ただしこの方法は、キー入力を"DirectInput"で拾っているようなアプリには
通用しません。SendInput とどちらの方法が良いのかは、ケースバイケースです。

[ツリー表示へ]
タイトルRe^2: キー入力をコードでする方法
記事No14316
投稿日: 2009/12/14(Mon) 18:03
投稿者さくら
魔界の仮面弁士さま

早急の御教授ありがとう御座います。
F15ではなく、F5でした。。。
初歩的なミスで申し訳ありません。

また、かなり説明不足でこちらも申し訳ありませんでした。

現在、コマンドボタンを押した後、タイマーを回して一定時間ごとに
URLを更新する処理を行おうとしています。
(最初の何も立ち上がっていない状態では、IEが起動しその後一定時間
 が経つごとに、更新はされるのですが、表示されている位置(IE内の表示)
 がズレてしまって困っていました。
 位置を記憶する方法もあるのかも知れませんが、何せ初心者なもので、
 F5キーの更新ですと位置がズレないで更新出来たため・・・
 因みに、現在は他のアプリケーションがアクティブで、IEが隠れている
 時も、処理を行ってくれいます。←理想です。)

色々と試させて頂きますが、何せお時間が掛かりそうなため、まずはお礼まで・・・

ありがとうございます。

因みに、タイマーで一定時間が経つ毎に

Call Y_Exec(1, URL, "", "", SW_SHOWNORMAL)

で、任意のURLの処理を行っています。

Public Sub Y_Exec(hWnd As Long, FilePath As String, parameter As String, _
WorkPath As String, WindowSize As Long)

     Dim longret As Long
     Dim msg As String

     longret = ShellExecute(hWnd, "Open", FilePath, parameter, WorkPath,_
               WindowSize)

     If longret < 31 Then
         Select Case longret
             Case 0
                 msg = "メモリ不足です。"
             Case ERROR_FILE_NOT_FOUND
                 msg = "ファイルが見つかりません。"
             Case ERROR_PATH_NOT_FOUND
                 msg = "ファイルのパスが見つかりません。"
             Case Else
                 msg = longret & "その他のエラー"
         End Select
         Call MsgBox(msg, 16)
     End If

End Sub

[ツリー表示へ]
タイトルRe^3: キー入力をコードでする方法
記事No14318
投稿日: 2009/12/14(Mon) 19:18
投稿者魔界の仮面弁士
> 現在、コマンドボタンを押した後、タイマーを回して一定時間ごとに
> URLを更新する処理を行おうとしています。

InternetExplorer オブジェクトの Refresh メソッドでは駄目でしょうか?
http://msdn.microsoft.com/en-us/library/aa752098.aspx

Option Explicit

Private IE As Object

Private Sub Form_Load()
    Timer1.Enabled = False
    Timer1.Interval = 10000     '10秒おき

    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    IE.Left = 50
    IE.Top = 100
    IE.Width = 600
    IE.Height = 400

    '任意のURL
    IE.Navigate "http://www.yahoo.co.jp/"

    Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    IE.Quit
    Set IE = Nothing
End Sub

Private Sub Timer1_Timer()
    On Error Resume Next
    IE.Refresh
End Sub

[ツリー表示へ]
タイトルRe^4: キー入力をコードでする方法
記事No14319
投稿日: 2009/12/14(Mon) 20:52
投稿者さくら
魔界の仮面弁士さま

度々の、早急の御指導ありがとうございます。

しかしながら、試行に時間が掛かり大変申し訳ありません。

またまた、暫くお時間を頂きたく、まずはお礼までとさせて下さい。

ありがとう御座います。

[ツリー表示へ]
タイトルRe^4: キー入力をコードでする方法
記事No14321
投稿日: 2009/12/15(Tue) 14:52
投稿者さくら
魔界の仮面弁士さま

Refresh メソッド知りませんでした。
遅くなりましたが試してみたところ、素晴らしいです♪

自フォームなど気を使って頂き、
更には、大変参考になる例文まで・・・

ありがとうございますm(__)m

思い通りに出来そうなので、早速こらから作成してみます!

[ツリー表示へ]