2012-02-15 12 views
4

私はJNAのウィンドウでマウスのクリックをシミュレートしようとしています。JNAでマウスをクリック

public class App { 

public static final int WM_LBUTTONUP = 514; 
public static final int WM_LBUTTONDOWN = 513; 
public static final int WM_LBUTTONDBLCLK = 0x203; 
static int WM_CLOSE = 0x10; 
final static String winTitle = "Untitled - Notepad"; 

public static void main(String[] args) throws InterruptedException { 
    User32Extra user32 = (User32Extra) Native.loadLibrary("user32", User32Extra.class, W32APIOptions.DEFAULT_OPTIONS); 

    WinDef.HWND hwnd = user32.FindWindow(null, winTitle); 
    user32.SetForegroundWindow(hwnd); 
    Thread.sleep(1000); 

    long y = 77 + (22 << 16);//x + (y << 16) 
    WinDef.LPARAM l = new WinDef.LPARAM(y); 
    WinDef.WPARAM w = new WinDef.WPARAM(0); 
    user32.PostMessage(hwnd, WM_LBUTTONDOWN, w, l); 
    Thread.sleep(1000); 
    user32.PostMessage(hwnd, WM_LBUTTONUP, w, l); 
} 
} 

ウィンドウを見つけて前面に表示します。マウスクリックは機能しません。 WM_CLOSEも送信します。 マウスクリックで何が問題になっていますか? 電卓とメモ帳でテスト済みです。 座標はウィンドウに対して相対的です。

+0

+1 ...純粋なJavaでは(少なくとも別のアプリケーションに属するウィンドウではないにしても)ウィンドウの位置を見つけて前面に移動することはできないので、ここではJNAは素晴らしいですが... Javaロボットを使用して実行できます。ウィンドウを見つけてJNAを使用して、それをフロントに持ってきて、クリックをシミュレートするために単純なJavaロボットを使用するオプションはありますか? – TacticalCoder

+0

ロボットが実際のカーソルを動かすと、本当に面倒です。また、ターゲットウィンドウが他のものと重なっていないことが必要です。しかしPostMessageでは、カーソルが動かずにウィンドウがバックグラウンドのどこかにあっても動作します。 – NullPointer

+0

a)*ロボットが実際のカーソルを動かすと本当に迷惑です。* [sic]ロボットでは、マウスの位置を保存し、マウスを移動し、クリックし、元の場所に戻します。それは非常に速いので、ユーザーはそれを見ていない(そこにいて、それをした;)b)* "それはターゲットウィンドウが他のものと重なっていないことを要求する" * [sic] (ほとんどの場合、ウィンドウが前面に来たら、それは前面にあります...私はいくつかのケースではまだ前にあるものがもっとあるかもしれませんが、これは珍しいものではありません! – TacticalCoder

答えて

1

野生の推測:クリックイベントはメインウィンドウに配信されるのではなく、送信先ボタンオブジェクト自体に配信されるべきです。与えられた座標上で、ボタンはメインウィンドウの上にあり、実際のクリックが発生したときにそれを「隠す」。

+0

はい、あなたは絶対に正しいです。私はWindowsコンポーネントに基づいていないアプリケーションでそれをテストしました:netbeans、firefox、それは正常に動作します。 – NullPointer

関連する問題