2

現在、VBA でタイマー クラスを実装しようとしています。そのために、Windows API の SetTimer および KillTimer 関数を使用します...

これは Msdn からのインターフェイスです:

  UINT_PTR WINAPI SetTimer(
  __in_opt  HWND hWnd,
  __in      UINT_PTR nIDEvent,
  __in      UINT uElapse,
  __in_opt  TIMERPROC lpTimerFunc
);

これは、VBA モジュール内で関数を宣言した方法です。

Private Declare Function SetTimer Lib "user32" (ByVal Handle As Long, _
                                                ByVal TimerIDHandle As Any, _
                                                ByVal ElapseTime As Long, _
                                                ByVal AddressOfAndYourHandlerFunctionName As Long) As Long

                                                'TimerIDHandle is of Type Any so I can pass Nothing to the function

次に、この方法で関数を呼び出します。

Dim TimerID As Long

TimerID = SetTimer(Application.hWndAccessApp, ByVal 0&, Timer.Timeout, AddressOf TimeOutHandler)

Vba は「Null」を受け入れないため、「ByVal 0&」を実装してみました。これは正しい方法ですか?とにかく...同じアプリケーションからこの関数を数回呼び出しますが、関数は常に識別子として 1 を返しますが、Msdn によれば、関数は現在のウィンドウ ハンドルで作成された各タイマーに対して一意の ID を返す必要があります。アプリケーションにアクセスします。

さらに、タイマーを 1 つだけ作成すると、コールバック関数が呼び出されますが、タイマー ID は 0 として指定されますが、Settimer-Function は初期化時に 1 を返します。ここに私のコールバック関数ヘッダーがあります:

Private Sub TimeOutHandler(ByVal WindowHandle As Long, _
                           ByVal TimerMessage As Long, _ 
                           ByVal TimerID As Long, _ 
                           ByVal ElapsedTime As Long)

どこが間違っていますか?

もちろん、どんな助けも大歓迎です;-)

4

1 に答える 1

3

出来た。失敗した場合は 0 が返されます。タイマーを作成したときに nIDEvent 引数に 0 を渡したので、コールバックで TimerID に 0 が返されます。KillTimer() を呼び出すには、SetTimer が返した値を使用する必要があります。タイマーの「ハンドル」と考えてください。

このコードが 64 ビット モードで動作することは決してないため、2 番目の引数を Long として宣言するだけです。

于 2012-04-06T13:32:25.213 に答える