1

私はpython 2.6しか持っていません。外部ライブラリを使用せずにこれを行うことはできますか? 現在カーソルがある場所で左クリックを実行したいだけです。

4

1 に答える 1

3

わかりました。まず、user32 windll を 経由ctypesで開く方法を知っておく必要があります。これは簡単です。

from ctypes import *
user32 = windll.user32

次に、呼び出したい Win32 関数はおそらくSendInputですが、比較対照するために (mouse_eventおよびSendMessageWM_* メッセージがマウス クリックに対応するドキュメント) を参照することをお勧めします。

を使用すると仮定すると、 以外のすべてのパラメーターに対して 0 を指定して、 を1 つ送信し、続いて 1SendInputつを送信します。MOUSEEVENTF_LEFTDOWNMOUSEEVENTF_LEFTUPdwFlags

それで、あなたはこれをどのように呼びますか?さて、ここにC APIがあります:

UINT WINAPI SendInput(
  _In_  UINT nInputs,
  _In_  LPINPUT pInputs,
  _In_  int cbSize
);

これは、構造体LPINPUTの配列へのポインターを取得したことを意味します。構造自体には、、およびの和集合があるINPUTため、それらも定義する必要があります (ただし、最初のものだけを定義し、他のものは存在しないふりをするだけで済みます。必要なのは最初のものだけなので)。 .INPUTMOUSEINPUTKBDINPUTHARDWAREINPUT

したがって、これを行う手順は次のctypesとおりです。

  • とのを定義しStructureます。MOUSEINPUTINPUT
  • user32Windll をロードします。
  • を設定argtypesuser32.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 について調べる必要があります。最悪の場合は、下位レベルのトリックにフォールバックする必要があるかもしれません。

これで十分ですか、それとも特定の部分についてサポートが必要ですか?

于 2012-12-22T00:02:58.893 に答える