MENU  □ MANUAL  □ 新着記事  □ 新規トピック追加  □ トピック一覧  □ SEARCH  □ 過去ログ
ログ内検索
・ キーワードを複数指定する場合は 半角スペース で区切ってください。
・ 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
・ 過去ログから探す場合は過去ログをチェック。
・ 過去ログは番号が大きいほど新しいログです。

キーワード/
検索条件/ (AND) (OR)
検索範囲(現在のログ)
(過去ログ1) (過去ログ2) (過去ログ3) (過去ログ4) (過去ログ5)
(過去ログ6) (過去ログ7) (過去ログ8) (過去ログ9) (過去ログ10)
(過去ログ11) (過去ログ12) (過去ログ13) (過去ログ14) (過去ログ15)
(過去ログ16) (過去ログ17) (過去ログ18) (過去ログ19) (過去ログ20)
(過去ログ21) (過去ログ22) (過去ログ23) (過去ログ24) (過去ログ25)
(過去ログ26) (過去ログ27) (過去ログ28) (過去ログ29) (過去ログ30)
(過去ログ31) (過去ログ32) (過去ログ33) (過去ログ34) (過去ログ35)

過去ログ12 を検索

HIT数 / 5件
NO.97451  GetInputStateの使い方
■投稿者/ Rocker
■投稿日/ 2007/05/21(Mon) 16:11:04
□URL/

お世話になります。

以前にも似たような質問をさせていただきました。

EXCELに表示されている行番号を正確にとらえ、表示範囲が変更された場合(スクロール、ZOOM、その他で・・)、動的にある処理をする必要があります。
変更された範囲については、visibleRangeプロパティで変化を捉えることができるのですが、それトリガー(きっかけ)となるイベントがありません。

しかたがないので、Win32 APIのGetInputStateでマウス、またはキーボードの入力を待ち構えることにしました。 ところが、GetInputStateは入力があった場合は、1を返すはずなのですが、マウスボタンを押すと、1が返ったり、返らなかったり、また、キーをおしても反応しないようです。
実験は書きのコードにより、マウス、キーバードを押すと列1に"aa"という文字を行1から下に向かって書くようにしました。

根本的にこのAPIの使い方が間違っているのでしょうか? Web上で検索しても非常にシンプルなサンプルがあり、単純にこのAPIの0,1を判断して使っているようですので、わたしのコードで問題ないように思えるのですが・・・
どなたかアドバイスをお願いできますでしょうか。


Dim i
Sub Main()
i = 1
Do
If GetInputState <> 0 Then
Cells(i, 1) = "aa"
i = i + 1
End If
DoEvents
Loop
MsgBox "マウスクリックかキーの入力がありました。", vbInformation, "確認"
End Sub



この記事にはVBAのコードが含まれています。

緑の太文字→注釈
茶色の太文字→条件分岐
赤の太文字→ループ
青の太文字→その他



++++++++++++++++++++
OS      ⇒Windows 2000
Version⇒Excel 2000
++++++++++++++++++++
親記事
削除チェック/

NO.97452  Re[1]: GetInputStateの使い方
■投稿者/ 藤代千尋
■投稿日/ 2007/05/21(Mon) 16:35:44
□URL/

> 根本的にこのAPIの使い方が間違っているのでしょうか?

間違ってはいないでしょうが、適用先がおかしいと思います。

その API は、メッセージキューの中を探しますが、キューは Excel のものです。
Excel がキューの中のメッセージを処理した後であれば、見つかりません。

マウス・キーボードの監視だと、フックの方が適切かな〜と思いますが、1 秒単
位のタイマーとかでもいいような気がします。

キーの状態を見る API だと、マウスまで見れるのは GetAsyncKeyState がすぐに
思いつきます。ただ、これで複数のキーの監視を行うと、激しく重いです。(^^;)

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Public i As Long
Public Sub Main()
Dim fMoveKey As Boolean

i = 1
Do
fMoveKey = False
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyLButton) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyUp) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyDown) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyLeft) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyRight) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyPageUp) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyPageDown) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyEnd) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyHome) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyTab) And 1)
fMoveKey = fMoveKey Or (GetAsyncKeyState(vbKeyReturn) And 1)

If fMoveKey Then
Debug.Print i, Timer
i = i + 1
End If
DoEvents
Loop
End Sub


この記事にはVBAのコードが含まれています。

緑の太文字→注釈
茶色の太文字→条件分岐
赤の太文字→ループ
青の太文字→その他
記事NO.97451 のレス /
削除チェック/

NO.97462  Re[2]: GetInputStateの使い方
■投稿者/ Rocker
■投稿日/ 2007/05/21(Mon) 20:08:40
□URL/

藤代千尋さん、いつもありがとうございます。

>マウス・キーボードの監視だと、フックの方が適切かな〜と思いますが、1 秒単
>位のタイマーとかでもいいような気がします。
この"フック"とは、GetAsyncKeyState のサンプルコードのことなのでしょうか。あるいは、このAPIを使用する以外の"フック"をするやり方が別にあるのでしょうか。
(基本的な言葉がよくわからなくて申し訳ありません。)


この記事にはVBAのコードが含まれています。

緑の太文字→注釈
茶色の太文字→条件分岐
赤の太文字→ループ
青の太文字→その他
記事NO.97451 のレス /
削除チェック/

NO.97486  Re[3]: GetInputStateの使い方
■投稿者/ 藤代千尋
■投稿日/ 2007/05/22(Tue) 11:54:43
□URL/

> > キーの状態を見る API だと、マウスまで見れるのは GetAsyncKeyState 

フックは、SetWindowsHookEx とかです。(^^)


この記事にはVBAのコードが含まれています。

緑の太文字→注釈
茶色の太文字→条件分岐
赤の太文字→ループ
青の太文字→その他
記事NO.97451 のレス /
削除チェック/

NO.97492  Re[4]: GetInputStateの使い方
■投稿者/ Rocker
■投稿日/ 2007/05/22(Tue) 12:25:19
□URL/

藤代千尋さん、ありがとございました。
記事NO.97451 のレス / END
削除チェック/


パスワード/

- Child SEARCH -