24

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

Pythonでできればいいのですが、誰かがそれをどの言語でも説明できれば、私はそれを理解できるかもしれません。

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 を返します。私はpygameに慣れていません。何か不足していますか?

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

4

5 に答える 5

31

プログラムの外部でマウスイベントを検出する唯一の方法は、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スクリプトで使用するのは難しいかもしれません。チュートリアルから:

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

于 2008-10-03T21:38:15.320 に答える
4

GUIプログラミングを含むWindowsMFCは、MarkHammondによるPythonforWindows拡張機能を使用してPythonでアクセスできます。ハモンドとロビンソンの本からのオライリーの本の抜粋は、マウスメッセージをフックする方法を示しています。

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

生のMFCは簡単でも明白でもありませんが、Pythonの例をWebで検索すると、いくつかの有用な例が得られる場合があります。

于 2008-10-03T09:56:35.030 に答える
2

それを行うWindowsの方法は、WM_LBUTTONDBLCLKメッセージを処理することです。

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

Pythonでこれを適用する方法がわからないのではないかと思いますが、ヒントが得られることを願っています。

于 2008-10-03T09:13:27.253 に答える