2008-10-03 73 views
16

マウスのウィンドウに関係なく、マウスのクリックを検出するにはどうすればよいですか?Pythonを使用してWindowsでマウスのクリックを検出する

PythonでPerferabliyですが、誰かがそれを説明できるのであれば、私はそれを理解することができます。

私はMicrosoftのサイトでこれを見つけた: http://msdn.microsoft.com/en-us/library/ms645533(VS.85).aspx

しかし、私は、私が記載された通知を検出するか、または拾うことができますどのように表示されません。次のように

はpygameののpygame.mouse.get_pos()関数を使用してみました:

import pygame 
pygame.init() 
while True: 
    print pygame.mouse.get_pos() 

これはちょうど0,0を返します。 私はパイゲームに精通していませんが、何か不足していますか?

いずれの場合でも、サードパーティのモジュールをインストールする必要がない方法をお勧めします。 (pywin32以外http://sourceforge.net/projects/pywin32/

+0

どのUIツールキット/ライブラリを使用していますか? –

+2

私はこれがwin32uiとctypesを使って可能であるべきだと思います。私は、マウスの位置をwindll.user32.GetCursorPos(ポインタ(pt_struct))で得ることができることを発見しました(詳細はhttp://monkut.webfactional.com/blog/archive/2008/10/2/python-win-mouse PyHookはインポートに 'ctypes' ライブラリを終了し、現在のスレッドのどこにでも実行したい場合は – monkut

答えて

29

プログラム外のマウスイベントを検出する唯一の方法は、SetWindowsHookExを使用してWindowsフックをインストールすることです。 pyHookモジュールは、きめ細かな詳細をカプセル化します。ここでは、すべてのマウスクリックの位置を出力しますサンプルです:

import pyHook 
import pythoncom 

def onclick(event): 
    print event.Position 
    return True 

hm = pyHook.HookManager() 
hm.SubscribeMouseAllButtonsDown(onclick) 
hm.HookMouse() 
pythoncom.PumpMessages() 
hm.UnhookMouse() 

あなたはイベントパラメータについての詳細はモジュールと一緒にインストールされてexample.pyスクリプトを確認することができます。

pyHookは、アクティブなメッセージポンプが必要なため、純粋なPythonスクリプトで使用するのは難しいかもしれません。 tutorialから:

Windowsメッセージポンプを持っている必要があります グローバル入力イベントの 通知を受信したい任意のアプリケーション。 これらのいずれかを取得する最も簡単な方法は、 Python用の Win32拡張パッケージのPumpMessagesメソッドを使用することです。 [...]実行すると、このプログラムはアイドルで と表示され、Windowsのイベントが待っています。 GUIツールキット( wxPythonなど)を使用している の場合は、ツールキットが独自に提供するので、このループは不要です 。

+0

注: ' ctypes.windll.user32.PostQuitMessage(0) ' これは' pythoncom.PumpMessages() 'を終了します。 –

+0

をhttps://sourceforge.net/projects/pyhook/する一方で、かなりの周りに移動したこと位) –

2

ウィンドウの方法は、WM_LBUTTONDBLCLKメッセージを処理することです。

これを送信するには、ウィンドウクラスをCS_DBLCLKSクラススタイルで作成する必要があります。

私はこれをPythonでどのように適用するのか分かりませんが、うまくいけばヒントを与えるかもしれません。

4

GUIプログラミングを含むWindows MFCは、Mark HammondのPython for Windows extensionsを使用してPythonでアクセスできます。ハモンドさんとロビンソンbookからAn O'Reilly Book Excerptがマウスメッセージをフックする方法を示し、.e.g:

self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE) 

生MFCは簡単か、明らかではありませんが、Pythonの例については、ウェブを検索すると、いくつかの使用可能な例をもたらす可能性があります。

10

私はwin32apiを使用します。任意のウィンドウをクリックすると動作します。この質問を頼まれたので、

# Code to check if left or right mouse buttons were pressed 
import win32api 
import time 

state_left = win32api.GetKeyState(0x01) # Left button down = 0 or 1. Button up = -127 or -128 
state_right = win32api.GetKeyState(0x02) # Right button down = 0 or 1. Button up = -127 or -128 

while True: 
    a = win32api.GetKeyState(0x01) 
    b = win32api.GetKeyState(0x02) 

    if a != state_left: # Button state changed 
     state_left = a 
     print(a) 
     if a < 0: 
      print('Left Button Pressed') 
     else: 
      print('Left Button Released') 

    if b != state_right: # Button state changed 
     state_right = b 
     print(b) 
     if b < 0: 
      print('Right Button Pressed') 
     else: 
      print('Right Button Released') 
    time.sleep(0.001) 
1

は暑い分をされているが、私は私の解決策を共有したいと思った:私はちょうど使用し、内蔵モジュール​​。 (私はPython 3.3 btwを使用しています)

import ctypes 
import time 

def DetectClick(button, watchtime = 5): 
    '''Waits watchtime seconds. Returns True on click, False otherwise''' 
    if button in (1, '1', 'l', 'L', 'left', 'Left', 'LEFT'): 
     bnum = 0x01 
    elif button in (2, '2', 'r', 'R', 'right', 'Right', 'RIGHT'): 
     bnum = 0x02 

    start = time.time() 
    while 1: 
     if ctypes.windll.user32.GetKeyState(bnum) not in [0, 1]: 
      #^this returns either 0 or 1 when button is not being held down 
      return True 
     elif time.time() - start >= watchtime: 
      break 
     time.sleep(0.001) 
    return False