Solved

Appactivate within a DO LOOP using vb.net 2005

Posted on 2009-04-02
3
552 Views
Last Modified: 2013-11-26
Hi,

I'm trying to add a System Tray icon  that will bring focus to Internet Explorer 7 and tab between all the windows within it. I'm writing this in VB using Visual Studio 2005. My knowledge of both VB and Visual Studio are limited. I've added a 'NotifyIcon' to a form. I don't actually need the form but this is only way I can see do add the notifyicon. I'm then basically activating the IE window and then using a sendkey to tab between the windows. I'm also using a sleep command. This is placed within  a simple DO LOOP. My problems are that when I double click the system tray icon my mouse and keyboard freeze. The only thing I can do is press ctrl-alt-del and this allows me to stop the process running. I know that is is caused by the do loop. The other problem is the sleep command. It won't neccesarily tab between the windows at the time period that I set. So if I set the sleep for 2 seconds, It will sometimes quickly move between the tabs and other times it will take many more seconds.
Also, if I run this as a simple .vbs file it works perfectly.
I've attached the code. Please help!
Imports System

Imports System.Windows.Forms

Imports Microsoft.VisualBasic.Interaction

Imports System.Threading
 

Public Class Form1
 

    Private Sub IE_Tab_MouseDoubleClick_1(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles IE_Tab.MouseDoubleClick

        Me.Hide()

        Dim WinFound As String
 

        WinFound = (" - Windows Internet Explorer")
 

        Do

            AppActivate(WinFound)

            SendKeys.Send("^{TAB}")

            Thread.Sleep(2000)
 

        Loop
 

    End Sub

End Class

Open in new window

0
Comment
Question by:planetzed
3 Comments
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 24049917
You need a "responsive" Sleep():

    Private Sub Delay(ByVal DelayInSeconds As Integer)
        Dim ts As TimeSpan
        Dim targetTime As DateTime = DateTime.Now.AddSeconds(DelayInSeconds)
        Do
            ts = targetTime.Subtract(DateTime.Now)
            Application.DoEvents() ' keep app responsive
            System.Threading.Thread.Sleep(50) ' reduce CPU usage
        Loop While ts.TotalSeconds > 0
    End Sub

Example:

    Delay(10) ' hold for ten seconds
0
 

Accepted Solution

by:
planetzed earned 0 total points
ID: 24057469
Hi,

Thanks for your response. I've managed to solve the problem in a much simpler way (for me anyway) by simply replacing the sendkeys.send with sendkeys.sendwait. I do have another question though in that I can't find how that If I close IE it won't error out. In .vbs I was able to use the following code ;

Set WShell = CreateObject("WScript.Shell")

Do
WinFound = WShell.AppActivate(" - Windows Internet Explorer")

If (WinFound) Then

Wshell.SendKeys "^{TAB}"
Wscript.Sleep (10 * 1000)

End If

Loop Until Not WinFound

As WinFound controls the whole process, I am then able to stop the loop once IE is no longer an active process. I can't find how to make this happen in Visual Studio. Any ideas?
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Suggested Solutions

A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
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…

747 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