Search in sources :

Example 1 with LRESULT

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");
        }
    }
}
Also used : HHOOK(com.sun.jna.platform.win32.WinUser.HHOOK) LRESULT(com.sun.jna.platform.win32.WinDef.LRESULT) HWND(com.sun.jna.platform.win32.WinDef.HWND) LPARAM(com.sun.jna.platform.win32.WinDef.LPARAM) COPYDATASTRUCT(com.sun.jna.platform.win32.WinUser.COPYDATASTRUCT) WPARAM(com.sun.jna.platform.win32.WinDef.WPARAM) Test(org.junit.Test)

Example 2 with LRESULT

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);
}
Also used : LRESULT(com.sun.jna.platform.win32.WinDef.LRESULT) LPARAM(com.sun.jna.platform.win32.WinDef.LPARAM) WPARAM(com.sun.jna.platform.win32.WinDef.WPARAM) DesktopWindow(com.sun.jna.platform.DesktopWindow) Test(org.junit.Test)

Example 3 with LRESULT

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);
}
Also used : LRESULT(com.sun.jna.platform.win32.WinDef.LRESULT) DWORDByReference(com.sun.jna.platform.win32.WinDef.DWORDByReference) LPARAM(com.sun.jna.platform.win32.WinDef.LPARAM) WPARAM(com.sun.jna.platform.win32.WinDef.WPARAM) DesktopWindow(com.sun.jna.platform.DesktopWindow) Test(org.junit.Test)

Example 4 with LRESULT

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!");
}
Also used : MSG(com.sun.jna.platform.win32.WinUser.MSG) HWND(com.sun.jna.platform.win32.WinDef.HWND) Pointer(com.sun.jna.Pointer) HMODULE(com.sun.jna.platform.win32.WinDef.HMODULE) WPARAM(com.sun.jna.platform.win32.WinDef.WPARAM) ULONG_PTR(com.sun.jna.platform.win32.BaseTSD.ULONG_PTR) WindowProc(com.sun.jna.platform.win32.WinUser.WindowProc) LRESULT(com.sun.jna.platform.win32.WinDef.LRESULT) WNDCLASSEX(com.sun.jna.platform.win32.WinUser.WNDCLASSEX) LPARAM(com.sun.jna.platform.win32.WinDef.LPARAM) COPYDATASTRUCT(com.sun.jna.platform.win32.WinUser.COPYDATASTRUCT)

Example 5 with LRESULT

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);
}
Also used : LRESULT(com.sun.jna.platform.win32.WinDef.LRESULT) HINSTANCE(com.sun.jna.platform.win32.WinDef.HINSTANCE) LPARAM(com.sun.jna.platform.win32.WinDef.LPARAM) HWND(com.sun.jna.platform.win32.WinDef.HWND) Pointer(com.sun.jna.Pointer) WPARAM(com.sun.jna.platform.win32.WinDef.WPARAM) HOOKPROC(com.sun.jna.platform.win32.WinUser.HOOKPROC)

Aggregations

LPARAM (com.sun.jna.platform.win32.WinDef.LPARAM)7 LRESULT (com.sun.jna.platform.win32.WinDef.LRESULT)7 WPARAM (com.sun.jna.platform.win32.WinDef.WPARAM)7 Pointer (com.sun.jna.Pointer)4 HWND (com.sun.jna.platform.win32.WinDef.HWND)4 Test (org.junit.Test)3 DesktopWindow (com.sun.jna.platform.DesktopWindow)2 DWORDByReference (com.sun.jna.platform.win32.WinDef.DWORDByReference)2 HMODULE (com.sun.jna.platform.win32.WinDef.HMODULE)2 COPYDATASTRUCT (com.sun.jna.platform.win32.WinUser.COPYDATASTRUCT)2 MSG (com.sun.jna.platform.win32.WinUser.MSG)2 ULONG_PTR (com.sun.jna.platform.win32.BaseTSD.ULONG_PTR)1 User32 (com.sun.jna.platform.win32.User32)1 HICON (com.sun.jna.platform.win32.WinDef.HICON)1 HINSTANCE (com.sun.jna.platform.win32.WinDef.HINSTANCE)1 HHOOK (com.sun.jna.platform.win32.WinUser.HHOOK)1 HOOKPROC (com.sun.jna.platform.win32.WinUser.HOOKPROC)1 KBDLLHOOKSTRUCT (com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT)1 LowLevelKeyboardProc (com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc)1 WNDCLASSEX (com.sun.jna.platform.win32.WinUser.WNDCLASSEX)1