私はpython 2.6しか持っていません。外部ライブラリを使用せずにこれを行うことはできますか? 現在カーソルがある場所で左クリックを実行したいだけです。
1 に答える
わかりました。まず、user32 windll を 経由ctypes
で開く方法を知っておく必要があります。これは簡単です。
from ctypes import *
user32 = windll.user32
次に、呼び出したい Win32 関数はおそらくSendInputですが、比較対照するために (mouse_event
およびSendMessage
WM_* メッセージがマウス クリックに対応するドキュメント) を参照することをお勧めします。
を使用すると仮定すると、 以外のすべてのパラメーターに対して 0 を指定して、 を1 つ送信し、続いて 1SendInput
つを送信します。MOUSEEVENTF_LEFTDOWN
MOUSEEVENTF_LEFTUP
dwFlags
それで、あなたはこれをどのように呼びますか?さて、ここにC APIがあります:
UINT WINAPI SendInput(
_In_ UINT nInputs,
_In_ LPINPUT pInputs,
_In_ int cbSize
);
これは、構造体LPINPUT
の配列へのポインターを取得したことを意味します。構造自体には、、およびの和集合があるINPUT
ため、それらも定義する必要があります (ただし、最初のものだけを定義し、他のものは存在しないふりをするだけで済みます。必要なのは最初のものだけなので)。 .INPUT
MOUSEINPUT
KBDINPUT
HARDWAREINPUT
したがって、これを行う手順は次のctypes
とおりです。
- とのを定義し
Structure
ます。MOUSEINPUT
INPUT
user32
Windll をロードします。- を設定
argtypes
しuser32.SendInput
ます。 - で最初の
MOUSEINPUT
インスタンスを作成しdwFlags= MOUSEEVENTF_LEFTDOWN
、それにINPUT
付随するインスタンスを作成します。 user32.SendInput(1, [myinput], len(INPUT))
または何でも呼び出しuser32.SendInput(1, addressof(myinput), len(INPUT))
ます( をどのように定義したかによって異なりますargtypes
)。- で 2 番目の
MOUSEINPUT
インスタンスを作成しdwFlags= MOUSEEVENTF_LEFT
、それにINPUT
付随するインスタンスを作成します。 user32.SendInput()
もう一度電話してください。
最後の注意: Vista 以降では、これを行うには適切な「整合性レベル」が必要です。たとえば、通常のアプリは、「昇格された」アプリ (インストーラーなど) にクリックを送信できません。うまくいけば、これはあなたにとって問題ではありません。そうであれば、UIPI と UAC について調べる必要があります。最悪の場合は、下位レベルのトリックにフォールバックする必要があるかもしれません。
これで十分ですか、それとも特定の部分についてサポートが必要ですか?