use of com.sun.jna.platform.win32.WinDef.LRESULT in project jna by java-native-access.
the class User32WindowMessagesTest method testWindowMesssages.
/**
* Instantiates 2 windows and make them communicate through windows messages, even complex ones throught
* WM_COPYDATA.
*/
@Test
public void testWindowMesssages() {
// note : check the asserts that are present in the callback implementations here after.
// Create window 1 named "ping"
createWindow("ping");
// let windows create the window before searching its handle.
sleepCurrThread(4000);
// Retrieves the created window's handle.
HWND hwndPing = determineHWNDFromWindowClass("ping");
assertNotNull(hwndPing);
HHOOK hook = null;
try {
// DEMO 1 : sends a simple message to ping window with code MSG_CODE and value 123456.
LRESULT result = User32.INSTANCE.SendMessage(hwndPing, WinUser.WM_USER, new WPARAM(MSG_SIMPLE_CODE), new LPARAM(MSG_SIMPLE_VAL));
log("User Message sent to " + hwndPing + ", result = " + result);
assertEquals(0, result.doubleValue(), 0);
// DEMO 2 : send of structured message.
// copyDataStruct must be held strongly on the java side.
// cf : https://github.com/java-native-access/jna/pull/774 comments.
COPYDATASTRUCT copyDataStruct = createStructuredMessage();
result = User32.INSTANCE.SendMessage(hwndPing, WinUser.WM_COPYDATA, null, /* No current hwnd for this demo */
new LPARAM(Pointer.nativeValue(copyDataStruct.getPointer())));
log("COPYDATASTRUCT sent message to " + hwndPing + "(size=" + copyDataStruct.size() + ") code =" + copyDataStruct.dwData);
assertEquals(0, result.intValue());
assertEquals(DATA_STRUCT_CODE, copyDataStruct.dwData.doubleValue(), 0);
// DEMO 3 : hook winproc then send a message to the hooked proc.
hook = hookwinProc(hwndPing);
result = User32.INSTANCE.SendMessage(hwndPing, WinUser.WM_USER, new WPARAM(MSG_HOOKED_CODE), new LPARAM(MSG_HOOKED_VAL));
log("User Message sent to hooked proc " + hwndPing + ", result = " + result);
assertEquals(0, result.intValue());
// Waits e few moment before shutdown message.
sleepCurrThread(3000);
} finally {
try {
// checks that there has been no exception in the created thread for windows messages receival.
assertNull("Unexpected exception in created Thread : " + exceptionInCreatedThread, exceptionInCreatedThread);
//assert done in a try block in order not to block the WM_CLOSE message sending.
} finally {
User32.INSTANCE.PostMessage(hwndPing, WinUser.WM_CLOSE, null, null);
log("WM_CLOSE posted to " + hwndPing);
// Remember to unhook the win proc.
if (hook != null) {
User32.INSTANCE.UnhookWindowsHookEx(hook);
}
log("Unhook done correctly");
}
}
}
use of com.sun.jna.platform.win32.WinDef.LRESULT in project jna by java-native-access.
the class User32Test method testSendMessage.
@Test
public void testSendMessage() {
DesktopWindow explorerProc = getWindowByProcessPath("explorer.exe");
assertNotNull(explorerProc);
LRESULT result = User32.INSTANCE.SendMessage(explorerProc.getHWND(), WinUser.WM_USER, new WPARAM(124), new LPARAM(12345));
assertNotEquals(0, result);
}
use of com.sun.jna.platform.win32.WinDef.LRESULT in project jna by java-native-access.
the class User32Test method testSendMessageTimeout.
@Test
public void testSendMessageTimeout() {
DesktopWindow explorerProc = getWindowByProcessPath("explorer.exe");
assertNotNull(explorerProc);
final DWORDByReference hIconNumber = new DWORDByReference();
LRESULT result = User32.INSTANCE.SendMessageTimeout(explorerProc.getHWND(), WinUser.WM_GETICON, new WPARAM(WinUser.ICON_BIG), new LPARAM(0), WinUser.SMTO_ABORTIFHUNG, 500, hIconNumber);
assertNotEquals(0, result);
}
use of com.sun.jna.platform.win32.WinDef.LRESULT in project jna by java-native-access.
the class User32WindowMessagesTest method createWindowAndLoop.
public void createWindowAndLoop(String windowClass) {
// define new window class
HMODULE hInst = Kernel32.INSTANCE.GetModuleHandle("");
WNDCLASSEX wClass = new WNDCLASSEX();
wClass.hInstance = hInst;
wClass.lpfnWndProc = new WindowProc() {
@Override
public LRESULT callback(HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam) {
// log(hwnd + " - received a message : " + uMsg);
switch(uMsg) {
case WinUser.WM_CREATE:
{
log(hwnd + " - onCreate: WM_CREATE");
return new LRESULT(0);
}
case WinUser.WM_CLOSE:
log(hwnd + " WM_CLOSE");
User32.INSTANCE.DestroyWindow(hwnd);
return new LRESULT(0);
case WinUser.WM_DESTROY:
{
log(hwnd + " - on Destroy.");
User32.INSTANCE.PostQuitMessage(0);
return new LRESULT(0);
}
case WinUser.WM_USER:
{
log(hwnd + " - received a WM_USER message with code : '" + wParam + "' and value : '" + lParam + "'");
if (wParam.intValue() == MSG_SIMPLE_CODE) {
assertEqualsForCallbackExecution(MSG_SIMPLE_VAL, lParam.intValue());
}
if (wParam.intValue() == MSG_HOOKED_CODE) {
assertEqualsForCallbackExecution(MSG_HOOKED_VAL, lParam.intValue());
}
return new LRESULT(0);
}
case WinUser.WM_COPYDATA:
{
COPYDATASTRUCT copyDataStruct = new COPYDATASTRUCT(new Pointer(lParam.longValue()));
ULONG_PTR uMsg1 = copyDataStruct.dwData;
Pointer lParam1 = copyDataStruct.lpData;
int wParam1 = copyDataStruct.cbData;
log(hwnd + " - received a WM_COPYDATA message with code : '" + uMsg1 + "' of size : '" + wParam1 + "'");
switch(uMsg1.intValue()) {
case DATA_STRUCT_CODE:
{
MsgStruct msg = new MsgStruct(lParam1);
// log(hwnd + " - received structured content : " + msg.toString(true));
log(hwnd + " - message is of type MsgStruct with number = " + msg.number + " and message = '" + msg.message + "'");
assertEqualsForCallbackExecution(MSG_STRUCT_NUMBER, msg.number);
assertEqualsForCallbackExecution(MSG_STRUCT_VAL, msg.message);
}
}
return new LRESULT(0);
}
default:
return User32.INSTANCE.DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
};
wClass.lpszClassName = windowClass;
// register window class
User32.INSTANCE.RegisterClassEx(wClass);
getLastError();
// create new window
HWND hWnd = User32.INSTANCE.CreateWindowEx(User32.WS_EX_TOPMOST, windowClass, "My hidden helper window, used only to catch the windows events", 0, 0, 0, 0, 0, null, null, hInst, null);
getLastError();
log("window sucessfully created! window hwnd: " + hWnd.getPointer().toString());
MSG msg = new MSG();
while (User32.INSTANCE.GetMessage(msg, hWnd, 0, 0) > 0) {
User32.INSTANCE.TranslateMessage(msg);
User32.INSTANCE.DispatchMessage(msg);
}
User32.INSTANCE.UnregisterClass(windowClass, hInst);
User32.INSTANCE.DestroyWindow(hWnd);
log("program exit!");
}
use of com.sun.jna.platform.win32.WinDef.LRESULT in project jna by java-native-access.
the class User32WindowMessagesTest method hookwinProc.
private HHOOK hookwinProc(HWND hwndToHook) {
HOOKPROC hookProc = new HOOKPROC() {
/**
* Callback method. cf : https://msdn.microsoft.com/en-us/library/windows/desktop/ms644975(v=vs.85).aspx
*
* nCode [in] : Specifies whether the hook procedure must process the message. If nCode is HC_ACTION, the
* hook procedure must process the message. If nCode is less than zero, the hook procedure must pass the
* message to the CallNextHookEx function without further processing and must return the value returned by
* CallNextHookEx. wParam [in] : Specifies whether the message was sent by the current thread. If the
* message was sent by the current thread, it is nonzero; otherwise, it is zero. lParam [in] : A pointer to
* a CWPSTRUCT structure that contains details about the message.
*
*/
// used by introspection from jna.
@SuppressWarnings("unused")
public LRESULT callback(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode < 0) {
return User32.INSTANCE.CallNextHookEx(null, nCode, wParam, lParam);
}
try {
WinUser.CWPSTRUCT cwp = new WinUser.CWPSTRUCT(new Pointer(lParam.longValue()));
switch(cwp.message) {
case WinUser.WM_USER:
{
HWND hWndSource = new HWND(new Pointer(cwp.wParam.longValue()));
log(cwp.hwnd + " - Received a message from " + hWndSource + " hooked proc : code= " + cwp.wParam + ", value = " + cwp.lParam);
assertEqualsForCallbackExecution(MSG_HOOKED_CODE, cwp.wParam.intValue());
assertEqualsForCallbackExecution(MSG_HOOKED_VAL, cwp.lParam.intValue());
return new LRESULT(0);
}
}
// Send message to next hook.
return User32.INSTANCE.CallNextHookEx(null, nCode, wParam, lParam);
} catch (Throwable t) {
t.printStackTrace();
return new LRESULT(0);
}
}
};
HINSTANCE hInst = Kernel32.INSTANCE.GetModuleHandle(null);
int threadtoHook = User32.INSTANCE.GetWindowThreadProcessId(hwndToHook, null);
// Hook of the wndProc
return User32.INSTANCE.SetWindowsHookEx(WinUser.WH_CALLWNDPROC, hookProc, hInst, threadtoHook);
}
Aggregations