Hatena::ブログ(Diary)

diaの備忘録

2011年07月02日

org.eclipse.swt.internal.Callback を用いてウィンドウメッセージを処理する

ほとんど情報ないのでメモ。

import java.util.ArrayList;

import org.eclipse.swt.internal.Callback;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.TCHAR;
import org.eclipse.swt.widgets.Control;

public final class WndProc {	
	public WndProc(Control control) {
		final Callback callback = new Callback(this, "wndProc", ARG_NUM);
		final int procAddress = callback.getAddress();
		prevProcHandle = OS.SetWindowLongPtr(control.handle, OS.GWLP_WNDPROC, procAddress);
		
		listeners = new ArrayList<Listener>();
	}
	
	public WndProc(Control control, Listener listener) {
		this(control);
		addSpiderListener(listener);
	}

	public void addSpiderListener(Listener listener) {
		if(listener == null) {
			throw new NullPointerException();
		}
		listeners.add(listener);
	}
	
	@SuppressWarnings("unused")
	private int wndProc(int hWnd, int code, int wParam, int lParam) {
		if (OS.WM_SETTEXT == code) {
			// KEYCODE
			if (wParam == Hook.HOOKED_SCANCODE) {
				return 0;
			}

			// IME
			if (wParam == Hook.HOOKED_IME_RESULTSTR) {
				final int size = OS.wcslen(lParam);
				if (size <= 0) {return 0;}
				char[] buffer = new char[size];
				OS.MoveMemory(buffer, lParam, size * TCHAR.sizeof);
				
				final String string = new String(buffer);
				
				// handler
				final Event event = new Event(string);
				for(Listener listener : listeners) {
					listener.spiderd(event);
				}
				
				return 0;
			}
		}

		return OS.CallWindowProc(prevProcHandle, hWnd, code, wParam, lParam);
	}

	private static final int ARG_NUM = 4;
	private int prevProcHandle;
	private ArrayList<Listener> listeners;
}

勘所

以下のコードで、Javaのメモリ空間に文字列をコピーしてくる。

LPARAMが何を指すかは WM_SETTEXT を参照。

一言で言うと、WINAPI的にはpszを表す。

final int size = OS.wcslen(lParam);
if (size <= 0) {return 0;}
char[] buffer = new char[size];
OS.MoveMemory(buffer, lParam, size * TCHAR.sizeof);

OS.MoveMemory は注意しないと、アクセス違反が発生するので注意。

トラックバック - http://d.hatena.ne.jp/DianthuDia/20110702/1309617035
リンク元