use of com.sun.jna.platform.win32.WinUser.COPYDATASTRUCT in project jna by java-native-access.
the class User32WindowMessagesTest method createStructuredMessage.
private COPYDATASTRUCT createStructuredMessage() {
MsgStruct myData = new MsgStruct();
myData.number = MSG_STRUCT_NUMBER;
myData.message = MSG_STRUCT_VAL;
// writes to native memory the data structure otherwise nothing is sent...
myData.write();
// log("Prepared structured content to send : " + myData.toString(true));
COPYDATASTRUCT copyDataStruct = new COPYDATASTRUCT();
copyDataStruct.dwData = new ULONG_PTR(DATA_STRUCT_CODE);
copyDataStruct.cbData = myData.size();
copyDataStruct.lpData = myData.getPointer();
// writes to native memory the data structure otherwise nothing is sent...
copyDataStruct.write();
return copyDataStruct;
}
use of com.sun.jna.platform.win32.WinUser.COPYDATASTRUCT 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.WinUser.COPYDATASTRUCT 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!");
}
Aggregations