Solved

Event when form loses focus?

Posted on 2004-09-01
9
528 Views
Last Modified: 2013-12-25
Hi,

I'd like my app to copy some specific data to the clipboard as soon as its form loses focus (when it's minimized, or when the user switches to another window).

I thought I could simply use the .LostFocus event for the form. I'm simply doing this:

  Private Sub Form_LostFocus()

    [code to copy data to clipboard]

  End Sub

...but it doesn't seem to have any effect. Maybe I'm using it wrong?

I know could keep a timer running to periodically check if the app still had the focus, but that seems kludgy. Isn't there a smoother way? Thanks!
0
Comment
Question by:Ander123
  • 2
  • 2
  • 2
  • +1
9 Comments
 
LVL 6

Expert Comment

by:msjammu
Comment Utility
I think You do it in Dactivate Event Instread

Private Sub Form_Deactivate()
    [code to copy data to clipboard]
End Sub

Regards,
0
 
LVL 6

Expert Comment

by:msjammu
Comment Utility
Dactivate  event is triggered in both the cases :
In case the form is minimized and when User shift to other window
0
 
LVL 15

Expert Comment

by:ameba
Comment Utility
Hi Ander123,

To catch when your application is deactivated, you must use subclassing:

"To get a notification when the application as a whole gets or loses the input focus, you must subclass
a form in your application, and watch for the WM_ACTIVATEAPP message. When this message is received,
the wParam argument holds zero if the application is losing the focus, or a non-zero value if the application
is getting the input focus." (from old vb2themax site)
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 17

Expert Comment

by:zzzzzooc
Comment Utility
To add to ameba's proposed solution, here's an example I submitted not too long ago..

http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_21082964.html
0
 

Accepted Solution

by:
Ander123 earned 0 total points
Comment Utility
Mstammu: Thanks for your suggestion. However, I couldn't get Form_Deactivate to work. I tried a test form with:

  Private Sub Form_Deactivate()

    Me.Caption = "I lost the focus!"

  End Sub

...but it had no effect when I switched to another window. VB's Language Reference says:

  "The Activate and Deactivate events occur only when moving the focus within an application. Moving the focus to or from an object in another application doesn't trigger either event."

Odd, isn't it, that Microsoft didn't provide an easy way to do such an obviously useful thing?

ameba & zzzzzooc: Yes, subclassing is amazing---but for this simple function, I think I'll just use a timer and an API call after all. When the user selects a data item in a list, I start a timer that checks the GetActiveWindow API at half-second intervals. When the app loses focus, it triggers the clipboard-copy:

[in declarations:]

  Private Declare Function GetActiveWindow lib "user32" () as long

[in main code:]

  Private Sub tmrCheckFocus_Timer()

    If GetActiveWindow = Me.hwnd Then

      CopyToClipboard

    End If

  End Sub

It works fine---and I figure that one check every half-second won't put much of a drain on anyone's resources.  :?)
0
 
LVL 15

Expert Comment

by:ameba
Comment Utility
Yes, that might be good choice (once you know your choices).  No-one mentioned it because you said  "I know I could keep a timer running to periodically check if the app still had the focus"
0
 

Author Comment

by:Ander123
Comment Utility
Hey, I know you guys are good! (Since I'd decided to use that method after all, I wanted to post the code in case it was useful to anyone else.)
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Introduction I needed to skip over some file processing within a For...Next loop in some old production code and wished that VB (classic) had a statement that would drop down to the end of the current iteration, bypassing the statements that were c…
Article by: Martin
Here are a few simple, working, games that you can use as-is or as the basis for your own games. Tic-Tac-Toe This is one of the simplest of all games.   The game allows for a choice of who goes first and keeps track of the number of wins for…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now