How to create a global hotkey?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • k04jg02@gmail.com

    How to create a global hotkey?

    I want to make a Python app that runs in the background, and when a
    user hits a key combination, for a function to run. This sounds simple
    enough, but all of the keypress detecting libraries I can find count on
    you creating a window and then detecting keypresses while that window
    has focus. I want my function to execute when the user presses the
    hotkey anywhere. I searched the PyGTK documentation and found an old
    newsgroup post where someone mentioned the C GTK+ library has it but
    PyGTK does not, PyQT showed no results, not sure where else I should
    look. I'd be willing to use a library that isn't a windowing toolkit --
    I just want to be able to be able to globally detect a keypress. Any
    ideas?

  • Diez B. Roggisch

    #2
    Re: How to create a global hotkey?

    k04jg02@gmail.c om wrote:
    I want to make a Python app that runs in the background, and when a
    user hits a key combination, for a function to run. This sounds simple
    enough, but all of the keypress detecting libraries I can find count on
    you creating a window and then detecting keypresses while that window
    has focus. I want my function to execute when the user presses the
    hotkey anywhere. I searched the PyGTK documentation and found an old
    newsgroup post where someone mentioned the C GTK+ library has it but
    PyGTK does not, PyQT showed no results, not sure where else I should
    look. I'd be willing to use a library that isn't a windowing toolkit --
    I just want to be able to be able to globally detect a keypress. Any
    ideas?
    What OS on? That is the key question here (sorry for the bad pun). It
    heavily depends on that, and possibly it hasn't to do with python at all,
    but instead configuring e.g. your window manager.

    Diez

    Comment

    • Gerold Penz

      #3
      Re: How to create a global hotkey?

      I want my function to execute when the user presses the
      hotkey anywhere.
      Hi!

      - XLib unter Linux: http://python-xlib.sourceforge.net/
      - wxPython unter Windows:


      regards,
      Gerold
      :-)

      --
      _______________ _______________ _______________ _______________ ____________
      Gerold Penz - bcom - Programmierung
      gerold.penz@tir ol.utanet.at | http://gerold.bcom.at | http://sw3.at
      Ehrliche, herzliche Begeisterung ist einer der
      wirksamsten Erfolgsfaktoren . Dale Carnegie

      Comment

      • dakman@gmail.com

        #4
        Re: How to create a global hotkey?

        XLib would really only see the keys pressed when under X, do you want
        it to catch the keys directly from the keyboard?

        Gerold Penz wrote:
        I want my function to execute when the user presses the
        hotkey anywhere.
        >
        Hi!
        >
        - XLib unter Linux: http://python-xlib.sourceforge.net/
        - wxPython unter Windows:

        >
        regards,
        Gerold
        :-)
        >
        --
        _______________ _______________ _______________ _______________ ____________
        Gerold Penz - bcom - Programmierung
        gerold.penz@tir ol.utanet.at | http://gerold.bcom.at | http://sw3.at
        Ehrliche, herzliche Begeisterung ist einer der
        wirksamsten Erfolgsfaktoren . Dale Carnegie

        Comment

        • Jordan

          #5
          Re: How to create a global hotkey?

          If you're using python 2.4, you can use the pyHook library (I don't
          think it has been ported to 2.5 yet... I should email him about that),
          which can hook both the mouse and keyboard, so your program can be
          running in the background and still catch what keys (or mouse clicks)
          are pressed. The pyHook extension comes with some very good examples
          of how to use it, but if they aren't good enough examples (I can't
          imagine that would happen), you should check out pykeylogger
          (sourceforge) which uses the pyHook extension (it's a really good
          program. Although not like conventional keyloggers built in C/C++ which
          hide themselves from the OS - the purpose was not actually to spy on
          the user but to create backups of what was typed - it still does a very
          good job and the latest release has a lot of options and
          extendability). If your OS is linux, unix, or mac... good luck ;D

          Cheers,
          Jordan


          Gerold Penz wrote:
          I want my function to execute when the user presses the
          hotkey anywhere.
          >
          Hi!
          >
          - XLib unter Linux: http://python-xlib.sourceforge.net/
          - wxPython unter Windows:

          >
          regards,
          Gerold
          :-)
          >
          --
          _______________ _______________ _______________ _______________ ____________
          Gerold Penz - bcom - Programmierung
          gerold.penz@tir ol.utanet.at | http://gerold.bcom.at | http://sw3.at
          Ehrliche, herzliche Begeisterung ist einer der
          wirksamsten Erfolgsfaktoren . Dale Carnegie

          Comment

          • k04jg02@gmail.com

            #6
            Re: How to create a global hotkey?

            Sorry, I should have mentioned that I'm running Linux, and I only will
            be running this app while X is running. pyHook doesn't seem to be an
            option because it's win32 only. I'm guessing python-xlib is the way to
            go, but it seems to be that it relies on you understanding the C xlib
            library, which is old and heavily obfuscated. Any advice on how to use
            python xlib to register a global hotkey? In the docs I found the
            KeyEvent event type, but it seems to want a specific window too.

            Comment

            • Paul Boddie

              #7
              Re: How to create a global hotkey?

              k04jg02@gmail.c om wrote:
              Sorry, I should have mentioned that I'm running Linux, and I only will
              be running this app while X is running.
              Global "hot keys" are typically the domain of the desktop environment
              (or window manager for archaic desktops). For example, KDE has a
              configuration dialogue where you can define hot keys or key
              combinations that do particular things: I've got the Windows key doing
              useful stuff in combination with other keys, for example.

              So programmaticall y setting hot keys may be something that requires
              communication with the desktop environment, and it would appear that on
              KDE you have to put hot key definitions in a file and then import them,
              the latter possibly being achieved using the DCOP interprocess
              communications mechanism provided in the environment (try "dcop
              khotkeys khotkeys" at the shell). Here's the only documentation I've
              found so far:



              I suppose you could just plug in at the X level and have something
              define and intercept a hot key before the desktop environment has a
              chance to process it, but I doubt that this would be a particularly
              nice solution.

              Paul

              Comment

              • k04jg02@gmail.com

                #8
                Re: How to create a global hotkey?


                Paul Boddie wrote:
                k04jg02@gmail.c om wrote:
                Sorry, I should have mentioned that I'm running Linux, and I only will
                be running this app while X is running.
                >
                Global "hot keys" are typically the domain of the desktop environment
                (or window manager for archaic desktops).
                Yep, that's why my first thought was to use PyQT or PyGTK.
                Unfortunately neither seems to have the ability.
                So programmaticall y setting hot keys may be something that requires
                communication with the desktop environment, and it would appear that on
                KDE you have to put hot key definitions in a file and then import them,
                the latter possibly being achieved using the DCOP interprocess
                communications mechanism provided in the environment (try "dcop
                khotkeys khotkeys" at the shell).
                This is really annoying to setup and would be a KDE specific solution.
                Ideally this would work under Gnome or KDE. Applications do this all
                the time -- Amarok for example adds global shortcuts for playing,
                pausing, jumping to next track, etc. that work whether or not you're in
                KDE or Gnome.
                I suppose you could just plug in at the X level and have something
                define and intercept a hot key before the desktop environment has a
                chance to process it, but I doubt that this would be a particularly
                nice solution.
                Why not? If I had to guess at this point I'd say it's the 'right' way
                to do it. I'm going to be dealing with keypresses that no other apps or
                the desktop environments have bound to anything, so I'm not sure it
                really qualifies as 'intercepting'. If multiple apps have registered to
                receive global keypresses, and the first app that looks at a keypress
                doesn't know how to handle it, shouldn't it just get passed on to the
                next app?

                Comment

                • Jonathan Curran

                  #9
                  Re: How to create a global hotkey?

                  On Thursday 07 December 2006 05:53, k04jg02@gmail.c om wrote:
                  I want to make a Python app that runs in the background, and when a
                  user hits a key combination, for a function to run. This sounds simple
                  enough, but all of the keypress detecting libraries I can find count on
                  you creating a window and then detecting keypresses while that window
                  has focus. I want my function to execute when the user presses the
                  hotkey anywhere. I searched the PyGTK documentation and found an old
                  newsgroup post where someone mentioned the C GTK+ library has it but
                  PyGTK does not, PyQT showed no results, not sure where else I should
                  look. I'd be willing to use a library that isn't a windowing toolkit --
                  I just want to be able to be able to globally detect a keypress. Any
                  ideas?
                  A little bit of googling revealed:

                  XGrabKey: http://tronche.com/gui/x/xlib/input/XGrabKey.html
                  Example: http://tigerdyr.wheel.dk/ctwm-archive/1328.html

                  It's done here in C, hopefully you can do the same with the python module for
                  xlib that was mentioned earlier.

                  - Jonathan

                  Google = best friend

                  Comment

                  • Paul Boddie

                    #10
                    Re: How to create a global hotkey?

                    k04jg02@gmail.c om wrote:
                    Paul Boddie wrote:
                    [DCOP]
                    This is really annoying to setup and would be a KDE specific solution.
                    Searching for "PyKDE global shortcut" produced something at the PyQt
                    level:



                    I don't know whether that is useful in this context, however.
                    Ideally this would work under Gnome or KDE. Applications do this all
                    the time -- Amarok for example adds global shortcuts for playing,
                    pausing, jumping to next track, etc. that work whether or not you're in
                    KDE or Gnome.
                    The source code for Amarok is available, so if you're not afraid of
                    looking at C++ code there may be an answer somewhere in there.
                    I suppose you could just plug in at the X level and have something
                    define and intercept a hot key before the desktop environment has a
                    chance to process it, but I doubt that this would be a particularly
                    nice solution.
                    >
                    Why not? If I had to guess at this point I'd say it's the 'right' way
                    to do it. I'm going to be dealing with keypresses that no other apps or
                    the desktop environments have bound to anything, so I'm not sure it
                    really qualifies as 'intercepting'. If multiple apps have registered to
                    receive global keypresses, and the first app that looks at a keypress
                    doesn't know how to handle it, shouldn't it just get passed on to the
                    next app?
                    I'm not that familiar with the event model involved, but one
                    disadvantage of handling things at the X level is that people may not
                    be able to inspect or override any shortcuts or hot keys that your
                    application defines within their desktop environment's configuration
                    dialogues. That's why it may be best going through the desktop
                    environment, even though that might mean dealing with different
                    mechanisms in different cases.

                    Unfortunately, the freedesktop.org people haven't introduced standards
                    for global shortcuts, as far as I can tell. Here are some documents I
                    found (by searching for "global shortcut freedesktop standard"):




                    Paul

                    Comment

                    Working...