title: Create a native Windows window in JNA and some GetWindowLong with GWL_WNDPROC
body: <p>Good day,</p>
  
  <p>I have been using JNA for a while to interact with the Windows API and now I am stuck when creating a window. As far as I have done the following:
  1. Have created a child window of an existing window and obtained a valid handler to it.
  2. Understood that every window in Windows has a non-stop message-dispatch loop.
  3. Understood that the best way to include my window in the message-dispatch loop is to use something like the following code (not mine, but that is what I would do as well):</p>
  
  <pre><code>final LONG_PTR prevWndProc = new LONG_PTR(User32.INSTANCE.GetWindowLong(hwnd, User32.GWL_WNDPROC));       //this is to obtain a pointer to the WNDPROC of the parent window, which we are going to need later
    wndProcCallbackListener = new WndProcCallbackListener()
     {
        public LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam)
        {
           if (uMsg == WTSAPI.WM_POWERBROADCAST)
           {
             System.out.println("WM_POWERBROADCAST Event: hWnd="+hwnd+", uMsg="+uMsg+", uParam="+uParam+", lParam="+lParam);
           }
           else if (uMsg == WTSAPI.WTS_SESSION_CHANGE)
           {
             System.out.println("WTS_SESSION_CHANGE Event: hWnd="+hwnd+", uMsg="+uMsg+", uParam="+uParam+", lParam="+lParam);
           }
  
          //Call the window's actual WndProc so the events get processed.
          return User32.INSTANCE.CallWindowProc(prevWndProc, hWnd, uMsg, uParam, lParam);
        }
     };
        //Set the WndProc function to use our callback listener instead of the window's one. 
     int result = User32.INSTANCE.SetWindowLong(hwnd, User32.GWL_WNDPROC, wndProcCallbackListener);
  </code></pre>
  
  <p>However, my problem is when I call the GetWindowLong() for the parent window <strong>(my first line of code)</strong> I get a 0 for the pointer which indicated the function did not complete successfully. A subsequent call to GetLastError() and a quick check in the error codes give me an <strong>'Access is denied'</strong> error. This, of course, is logical, since I am trying from my own thread to access the address of the WNDPROC of another, but I was wondering if there is any way (there should be, of course) to circumvent that.</p>
  
  <p>Any pointers? (pun intended)</p>