How to detect when a user switches between windows (in WinXP)?

Discussion in 'Python' started by mangoldproject@gmail.com, Dec 25, 2007.

  1. Guest

    Hi everyone,

    I'm a beginning-to-intermediate Python programmer with some experience
    in other languages. At the moment I am trying to write a Python
    program that will run in the background and execute a series of
    commands whenever I switch between windows (my OS is Windows XP). For
    example, I want my program to do something when I switch to my Firefox
    browser, and then do something else when I switch to a certain sub-
    window in Photoshop (which has a certain title, and a certain photo
    associated with it), then do yet another thing when I switch to
    another sub-window (with a different title and photo) within
    Photoshop.
    The particular actions will be based on the window's title. I've
    already figured out how to retrieve that, using
    GetWindowText(GetForegroundWindow()) from the win32gui module.
    My question is, how can I detect when the user switches between
    windows? I haven't been able to figure that part out yet.
    Searching the group didn't give me any answers.
    Your help is greatly appreciated. Thanks!

    Assaf.
    , Dec 25, 2007
    #1
    1. Advertising

  2. Guest

    On Dec 25, 4:31 am, wrote:
    > Hi everyone,
    >
    > I'm a beginning-to-intermediate Python programmer with some experience
    > in other languages. At the moment I am trying to write a Python
    > program that will run in the background and execute a series of
    > commands whenever I switch between windows (my OS is Windows XP). For
    > example, I want my program to do something when I switch to my Firefox
    > browser, and then do something else when I switch to a certain sub-
    > window in Photoshop (which has a certain title, and a certain photo
    > associated with it), then do yet another thing when I switch to
    > another sub-window (with a different title and photo) within
    > Photoshop.
    > The particular actions will be based on the window's title. I've
    > already figured out how to retrieve that, using
    > GetWindowText(GetForegroundWindow()) from the win32gui module.
    > My question is, how can I detect when the user switches between
    > windows? I haven't been able to figure that part out yet.
    > Searching the group didn't give me any answers.
    > Your help is greatly appreciated. Thanks!
    >
    > Assaf.


    What you most likely want to do is run the win32gui call inside an
    infinite loop. Something along these lines:

    # untested code
    import time
    while True:
    winTitle = GetWindowText(GetForegroundWindow())
    if winTitle == 'some string':
    # do something
    time.sleep(1) # nap for a second


    This will check once a second to see what window you have up. You'll
    probably want to set some kind of sentinel value when it does
    something to the current window so it doesn't repeatedly do that
    something each second. Thus, the if-then logic will need to be more
    complex, but this should get you going.

    HTH

    Mike
    , Dec 25, 2007
    #2
    1. Advertising

  3. Tim Roberts Guest

    wrote:
    >
    >I'm a beginning-to-intermediate Python programmer with some experience
    >in other languages. At the moment I am trying to write a Python
    >program that will run in the background and execute a series of
    >commands whenever I switch between windows (my OS is Windows XP). For
    >example, I want my program to do something when I switch to my Firefox
    >browser, and then do something else when I switch to a certain sub-
    >window in Photoshop (which has a certain title, and a certain photo
    >associated with it), then do yet another thing when I switch to
    >another sub-window (with a different title and photo) within
    >Photoshop.
    >The particular actions will be based on the window's title. I've
    >already figured out how to retrieve that, using
    >GetWindowText(GetForegroundWindow()) from the win32gui module.
    >My question is, how can I detect when the user switches between
    >windows? I haven't been able to figure that part out yet.
    >Searching the group didn't give me any answers.


    The way you do this is to write a Windows hook. The WH_CBT hook intercepts
    WM_ACTIVATE and WM_DEACTIVATE calls system-wide.

    However, that requires injecting the hook DLL into every process with a
    Windows, and you certainly don't want to do that in Python. Write a
    minimal C DLL to be the hook, and have it send messages to your Python
    process.
    --
    Tim Roberts,
    Providenza & Boekelheide, Inc.
    Tim Roberts, Dec 27, 2007
    #3
  4. Tim Golden Guest

    Tim Roberts wrote:
    > wrote:
    >> I'm a beginning-to-intermediate Python programmer with some experience
    >> in other languages. At the moment I am trying to write a Python
    >> program that will run in the background and execute a series of
    >> commands whenever I switch between windows (my OS is Windows XP). For
    >> example, I want my program to do something when I switch to my Firefox
    >> browser, and then do something else when I switch to a certain sub-
    >> window in Photoshop (which has a certain title, and a certain photo
    >> associated with it), then do yet another thing when I switch to
    >> another sub-window (with a different title and photo) within
    >> Photoshop.
    >> The particular actions will be based on the window's title. I've
    >> already figured out how to retrieve that, using
    >> GetWindowText(GetForegroundWindow()) from the win32gui module.
    >> My question is, how can I detect when the user switches between
    >> windows? I haven't been able to figure that part out yet.
    >> Searching the group didn't give me any answers.

    >
    > The way you do this is to write a Windows hook. The WH_CBT hook intercepts
    > WM_ACTIVATE and WM_DEACTIVATE calls system-wide.
    >
    > However, that requires injecting the hook DLL into every process with a
    > Windows, and you certainly don't want to do that in Python. Write a
    > minimal C DLL to be the hook, and have it send messages to your Python
    > process.


    Also, aside from the technicalities of how you do this, be sure
    you've thought through the effect on user-interaction (if the
    user isn't you). Switching between windows is one of those things
    a user has a very definite expectation about. If you subvert that
    by doing "magic things" when you switch between this and that
    window then you might end up alienating the user.

    But, as Tim points out, system hooks are the way to go.

    TJG
    Tim Golden, Dec 27, 2007
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    2
    Views:
    478
  2. Thomas Koch

    Using Trace and Switches in ASP.NET

    Thomas Koch, Jan 27, 2004, in forum: ASP .Net
    Replies:
    2
    Views:
    585
    Thomas Koch
    Jan 28, 2004
  3. Guest
    Replies:
    4
    Views:
    412
    Guest
    Jan 28, 2005
  4. xaos
    Replies:
    7
    Views:
    2,107
  5. töff
    Replies:
    0
    Views:
    147
    töff
    May 5, 2007
Loading...

Share This Page