Make sure that HWND comparisons are always done with full 32-bit
handles.

diff --git a/controls/combo.c b/controls/combo.c
index 9b74ac1..92dddb2 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -16,6 +16,7 @@
 #include "wine/unicode.h"
 #include "spy.h"
 #include "user.h"
+#include "win.h"
 #include "controls.h"
 #include "debugtools.h"
 
@@ -1941,14 +1942,15 @@
 		    COMBO_SetFocus( lphc );
 		return  TRUE;
 	case WM_KILLFOCUS:
-#define hwndFocus ((HWND16)wParam)
+            {
+                HWND hwndFocus = WIN_GetFullHandle( (HWND)wParam );
 		if( !hwndFocus ||
 		    (hwndFocus != lphc->hWndEdit && hwndFocus != lphc->hWndLBox ))
 		    COMBO_KillFocus( lphc );
-#undef hwndFocus
 		return  TRUE;
+            }
 	case WM_COMMAND:
-		return  COMBO_Command( lphc, wParam, (HWND)lParam );
+		return  COMBO_Command( lphc, wParam, WIN_GetFullHandle( (HWND)lParam ) );
 	case WM_GETTEXT:
 		return COMBO_GetText( lphc, (INT)wParam, lParam, unicode );
 	case WM_SETTEXT:
diff --git a/controls/menu.c b/controls/menu.c
index 6092b45..675026d 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -353,7 +353,7 @@
     {
 	POPUPMENU *menu = MENU_GetMenu(hMenu);
 	menu->wFlags = MF_SYSMENU;
-	menu->hWnd = hWnd;
+	menu->hWnd = WIN_GetFullHandle( hWnd );
 
 	if (hPopupMenu == (HMENU)(-1))
 	    hPopupMenu = MENU_CopySysPopup();
@@ -2362,7 +2362,7 @@
 	else    /* application returned a new menu to switch to */
 	{
             hNewMenu = next_menu.hmenuNext;
-            hNewWnd = next_menu.hwndNext;
+            hNewWnd = WIN_GetFullHandle( next_menu.hwndNext );
 
 	    if( IsMenu(hNewMenu) && IsWindow(hNewWnd) )
 	    {
@@ -2609,7 +2609,7 @@
     mt.trackFlags = 0;
     mt.hCurrentMenu = hmenu;
     mt.hTopMenu = hmenu;
-    mt.hOwnerWnd = hwnd;
+    mt.hOwnerWnd = WIN_GetFullHandle( hwnd );
     mt.pt.x = x;
     mt.pt.y = y;
 
@@ -3968,6 +3968,7 @@
     }
     if (GetWindowLongA( hWnd, GWL_STYLE ) & WS_CHILD) return FALSE;
 
+    hWnd = WIN_GetFullHandle( hWnd );
     if (GetCapture() == hWnd) ReleaseCapture();
 
     if (hMenu != 0)
diff --git a/controls/scroll.c b/controls/scroll.c
index d9384ca..9c4501c 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -791,6 +791,7 @@
         ((nBar == SB_VERT) && !(wndPtr->dwStyle & WS_VSCROLL)) ||
         ((nBar == SB_HORZ) && !(wndPtr->dwStyle & WS_HSCROLL))) goto END;
     if (!WIN_IsWindowDrawable( wndPtr, FALSE )) goto END;
+    hwnd = wndPtr->hwndSelf;  /* make it a full handle */
 
     vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,
                                         &arrowSize, &thumbSize, &thumbPos );
@@ -1516,7 +1517,7 @@
     if (info->fMask & SIF_PAGE) info->nPage = infoPtr->Page;
     if (info->fMask & SIF_POS) info->nPos = infoPtr->CurVal;
     if ((info->fMask & SIF_TRACKPOS) && (info->cbSize == sizeof(*info)))
-        info->nTrackPos = (SCROLL_TrackingWin==hwnd) ? SCROLL_TrackingVal : infoPtr->CurVal;
+        info->nTrackPos = (SCROLL_TrackingWin == WIN_GetFullHandle(hwnd)) ? SCROLL_TrackingVal : infoPtr->CurVal;
     if (info->fMask & SIF_RANGE)
     {
 	info->nMin = infoPtr->MinVal;
diff --git a/dlls/user/comm16.c b/dlls/user/comm16.c
index 45a831f..a07b572 100644
--- a/dlls/user/comm16.c
+++ b/dlls/user/comm16.c
@@ -50,6 +50,7 @@
 #include "wine/winuser16.h"
 #include "wine/port.h"
 #include "heap.h"
+#include "win.h"
 #include "winerror.h"
 
 #include "debugtools.h"
@@ -82,7 +83,8 @@
     unsigned ibuf_size,ibuf_head,ibuf_tail;
     unsigned obuf_size,obuf_head,obuf_tail;
     /* notifications */
-    int wnd, n_read, n_write;
+    HWND wnd;
+    int n_read, n_write;
     OVERLAPPED read_ov, write_ov;
     /* save terminal states */
     DCB16 dcb;
@@ -1123,7 +1125,7 @@
 		FIXME("no handle for cid = %0x!\n",cid);
 		return -1;
 	}
-	ptr->wnd = hwnd;
+	ptr->wnd = WIN_Handle32( hwnd );
 	ptr->n_read = cbWriteNotify;
 	ptr->n_write = cbOutQueue;
 	return TRUE;
diff --git a/dlls/user/dde/client.c b/dlls/user/dde/client.c
index cc29252..dd45595 100644
--- a/dlls/user/dde/client.c
+++ b/dlls/user/dde/client.c
@@ -19,6 +19,7 @@
 #include "winnls.h"
 #include "dde.h"
 #include "ddeml.h"
+#include "win.h"
 #include "debugtools.h"
 #include "dde/dde_private.h"
 
@@ -343,7 +344,7 @@
     UINT		uiLo, uiHi;
     HSZ			hsz;
 
-    if (msg->message != WM_DDE_ACK || msg->wParam != pConv->hwndServer)
+    if (msg->message != WM_DDE_ACK || WIN_GetFullHandle(msg->wParam) != pConv->hwndServer)
     {
 	return WDML_QS_PASS;
     }
@@ -427,7 +428,7 @@
     UINT	uiLo, uiHi;
     HSZ		hsz;
 
-    if (msg->message != WM_DDE_ACK || msg->wParam != pConv->hwndServer)
+    if (msg->message != WM_DDE_ACK || WIN_GetFullHandle(msg->wParam) != pConv->hwndServer)
     {
 	return WDML_QS_PASS;
     }
@@ -498,7 +499,7 @@
     UINT		uiLo, uiHi;
     HSZ			hsz;
 
-    if (msg->wParam != pConv->hwndServer)
+    if (WIN_GetFullHandle(msg->wParam) != pConv->hwndServer)
 	return WDML_QS_PASS;
     UnpackDDElParam(WM_DDE_ACK, msg->lParam, &uiLo, &uiHi);
 
@@ -658,7 +659,7 @@
     DDEACK	ddeAck;
     UINT	uiLo, uiHi;
 
-    if (msg->message != WM_DDE_ACK || msg->wParam != pConv->hwndServer)
+    if (msg->message != WM_DDE_ACK || WIN_GetFullHandle(msg->wParam) != pConv->hwndServer)
     {
 	return WDML_QS_PASS;
     }
@@ -738,7 +739,7 @@
     UINT	uiLo, uiHi;
     HSZ		hsz;
 
-    if (msg->message != WM_DDE_ACK && msg->wParam != pConv->hwndServer)
+    if (msg->message != WM_DDE_ACK && WIN_GetFullHandle(msg->wParam) != pConv->hwndServer)
     {
 	return WDML_QS_PASS;
     }
@@ -791,7 +792,7 @@
 	return WDML_QS_SWALLOWED;
     }
 
-    if (msg->wParam != pConv->hwndServer)
+    if (WIN_GetFullHandle(msg->wParam) != pConv->hwndServer)
     {
 	FIXME("hmmm shouldn't happen\n");
 	return WDML_QS_PASS;
@@ -875,7 +876,7 @@
  */
 static WDML_QUEUE_STATE WDML_HandleIncomingTerminate(WDML_CONV* pConv, MSG* msg, HDDEDATA* hdd)
 {
-    if (pConv->hwndServer != (HWND)msg->wParam)
+    if (pConv->hwndServer != WIN_GetFullHandle(msg->wParam))
 	return WDML_QS_PASS;
     
     pConv->wStatus |= ST_TERMINATED;
@@ -1243,7 +1244,7 @@
 	    pConv->wStatus |= ST_ISLOCAL;
 	}
 
-	WDML_BroadcastDDEWindows(WDML_szEventClass, WM_WDML_CONNECT_CONFIRM, hwnd, (HWND)wParam);
+	WDML_BroadcastDDEWindows(WDML_szEventClass, WM_WDML_CONNECT_CONFIRM, (WPARAM)hwnd, wParam);
 
 	GlobalDeleteAtom(uiLo);
 	GlobalDeleteAtom(uiHi);
diff --git a/dlls/user/dde/misc.c b/dlls/user/dde/misc.c
index 5d97156..532f005 100644
--- a/dlls/user/dde/misc.c
+++ b/dlls/user/dde/misc.c
@@ -19,6 +19,7 @@
 #include "winerror.h"
 #include "dde.h"
 #include "ddeml.h"
+#include "win.h"
 #include "debugtools.h"
 #include "dde/dde_private.h"
 
@@ -302,9 +303,11 @@
 	    /* confirm connection...
 	     * lookup for this conv handle
 	     */
+            HWND client = WIN_GetFullHandle( (HWND)wParam );
+            HWND server = WIN_GetFullHandle( (HWND)lParam );
 	    for (pConv = pInstance->convs[WDML_SERVER_SIDE]; pConv != NULL; pConv = pConv->next)
 	    {
-		if (pConv->hwndClient == (HWND)wParam && pConv->hwndServer == (HWND)lParam)
+		if (pConv->hwndClient == client && pConv->hwndServer == server)
 		    break;
 	    }
 	    if (pConv)
@@ -1873,7 +1876,7 @@
 
     for (pLink = pConv->instance->links[side]; pLink != NULL; pLink = pLink->next)
     {
-	if (pLink->hConv == (HWND)pConv)
+	if (pLink->hConv == (HCONV)pConv)
 	{
 	    ci->wStatus |= ST_ADVISE;
 	    break;
diff --git a/dlls/user/dde/server.c b/dlls/user/dde/server.c
index c1e7af2..301c244 100644
--- a/dlls/user/dde/server.c
+++ b/dlls/user/dde/server.c
@@ -18,6 +18,7 @@
 #include "winerror.h"
 #include "dde.h"
 #include "ddeml.h"
+#include "win.h"
 #include "debugtools.h"
 #include "dde/dde_private.h"
 
@@ -983,7 +984,7 @@
 	ERR("Got a message (%u) on a not known conversation, dropping request\n", iMsg);
 	goto theError;
     }
-    if (pConv->hwndClient != (HWND)wParam || pConv->hwndServer != hwndServer)
+    if (pConv->hwndClient != WIN_GetFullHandle( (HWND)wParam ) || pConv->hwndServer != hwndServer)
     {
 	ERR("mismatch between C/S windows and converstation\n");
 	goto theError;
diff --git a/dlls/user/message.c b/dlls/user/message.c
index 57c9c16..1c5afa6 100644
--- a/dlls/user/message.c
+++ b/dlls/user/message.c
@@ -1815,6 +1815,7 @@
     if (USER_Driver.pMsgWaitForMultipleObjectsEx)
         USER_Driver.pMsgWaitForMultipleObjectsEx( 0, NULL, 0, 0, 0 );
 
+    hwnd = WIN_GetFullHandle( hwnd );
     locks = WIN_SuspendWndsLock();
 
     if (!MSG_peek_message( &msg, hwnd, first, last,
diff --git a/dlls/x11drv/scroll.c b/dlls/x11drv/scroll.c
index d9b65c6..96215dd 100644
--- a/dlls/x11drv/scroll.c
+++ b/dlls/x11drv/scroll.c
@@ -149,6 +149,7 @@
         retVal = ERROR;
         goto END;
     }
+    hwnd = wnd->hwndSelf;  /* make it a full handle */
 
     GetClientRect(hwnd, &rc);
     if (rect) IntersectRect(&rc, &rc, rect);
diff --git a/dlls/x11drv/window.c b/dlls/x11drv/window.c
index 22e19fb..7cc7d64 100644
--- a/dlls/x11drv/window.c
+++ b/dlls/x11drv/window.c
@@ -489,6 +489,8 @@
     {
         /* find window that this one must be after */
         HWND prev = GetWindow( win->hwndSelf, GW_HWNDPREV );
+        while (prev && !(GetWindowLongW( prev, GWL_STYLE ) & WS_VISIBLE))
+            prev = GetWindow( prev, GW_HWNDPREV );
         if (!prev)  /* top child */
         {
             changes.stack_mode = Above;
@@ -972,7 +974,6 @@
 {
     Display *display = thread_display();
     WND *wndPtr;
-    WND *pWndParent;
     DWORD dwStyle;
     HWND retvalue;
 
@@ -982,18 +983,12 @@
 
     if (!parent) parent = GetDesktopWindow();
 
-    if (!(pWndParent = WIN_FindWndPtr(parent)))
-    {
-        WIN_ReleaseWndPtr( wndPtr );
-        return 0;
-    }
-
     /* Windows hides the window first, then shows it again
      * including the WM_SHOWWINDOW messages and all */
     if (dwStyle & WS_VISIBLE) ShowWindow( hwnd, SW_HIDE );
 
     retvalue = wndPtr->parent->hwndSelf;  /* old parent */
-    if (pWndParent != wndPtr->parent)
+    if (parent != retvalue)
     {
         struct x11drv_win_data *data = wndPtr->pDriverData;
 
@@ -1001,21 +996,20 @@
 
         if (parent != GetDesktopWindow()) /* a child window */
         {
-            if (!(wndPtr->dwStyle & WS_CHILD) && wndPtr->wIDmenu)
+            if (!(dwStyle & WS_CHILD))
             {
-                DestroyMenu( (HMENU)wndPtr->wIDmenu );
-                wndPtr->wIDmenu = 0;
+                HMENU menu = (HMENU)SetWindowLongW( hwnd, GWL_ID, 0 );
+                if (menu) DestroyMenu( menu );
             }
         }
 
         if (is_window_top_level( wndPtr )) set_wm_hints( display, wndPtr );
         wine_tsx11_lock();
         sync_window_style( display, wndPtr );
-        XReparentWindow( display, data->whole_window, get_client_window(pWndParent),
+        XReparentWindow( display, data->whole_window, X11DRV_get_client_window(parent),
                          data->whole_rect.left, data->whole_rect.top );
         wine_tsx11_unlock();
     }
-    WIN_ReleaseWndPtr( pWndParent );
     WIN_ReleaseWndPtr( wndPtr );
 
     /* SetParent additionally needs to make hwnd the topmost window
@@ -1043,6 +1037,7 @@
     BOOL retvalue;
 
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
+    hwnd = wndPtr->hwndSelf;  /* make it a full handle */
 
     retvalue = ((wndPtr->dwStyle & WS_DISABLED) != 0);
 
diff --git a/dlls/x11drv/winpos.c b/dlls/x11drv/winpos.c
index fbe6fe8..c858ea6 100644
--- a/dlls/x11drv/winpos.c
+++ b/dlls/x11drv/winpos.c
@@ -618,6 +618,7 @@
     BOOL ret = TRUE;
 
     if (!wndPtr) return FALSE;
+    winpos->hwnd = wndPtr->hwndSelf;  /* make it a full handle */
 
     if (wndPtr->dwStyle & WS_VISIBLE) winpos->flags &= ~SWP_SHOWWINDOW;
     else
@@ -660,6 +661,7 @@
         WND* wnd = WIN_FindWndPtr(winpos->hwndInsertAfter);
         if (wnd)
         {
+            winpos->hwndInsertAfter = wnd->hwndSelf;  /* make it a full handle */
             if (wnd->parent != wndPtr->parent) ret = FALSE;
             else
             {
@@ -696,12 +698,12 @@
     bChangePos = !(winpos->flags & SWP_WINE_NOHOSTMOVE);
     winpos->flags &= ~SWP_WINE_NOHOSTMOVE;
 
-    /* Check window handle */
-    if (winpos->hwnd == GetDesktopWindow()) return FALSE;
-
     /* Fix redundant flags */
     if (!fixup_flags( winpos )) return FALSE;
 
+    /* Check window handle */
+    if (winpos->hwnd == GetDesktopWindow()) return FALSE;
+
     SWP_DoWinPosChanging( winpos, &newWindowRect, &newClientRect );
 
     if (!(wndPtr = WIN_FindWndPtr( winpos->hwnd ))) return FALSE;
@@ -1023,6 +1025,7 @@
     UINT 	swp = 0;
 
     if (!wndPtr) return FALSE;
+    hwnd = wndPtr->hwndSelf;  /* make it a full handle */
 
     TRACE("hwnd=%04x, cmd=%d\n", hwnd, cmd);
 
diff --git a/windows/caret.c b/windows/caret.c
index 6f5266d..c20d17e 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -25,7 +25,7 @@
     INT      y;
     INT      width;
     INT      height;
-    HBRUSH16   hBrush;
+    HBRUSH   hBrush;
     UINT     timeout;
     UINT     timerid;
 } CARET;
@@ -62,7 +62,7 @@
 static void CARET_DisplayCaret( DISPLAY_CARET status )
 {
     HDC hdc;
-    HBRUSH16 hPrevBrush;
+    HBRUSH hPrevBrush;
 
     if (Caret.on && (status == CARET_ON)) return;
     if (!Caret.on && (status == CARET_OFF)) return;
@@ -168,7 +168,7 @@
                                           GetSysColor(COLOR_WINDOW) );
     }
 
-    Caret.hwnd = hwnd;
+    Caret.hwnd = WIN_GetFullHandle( hwnd );
     Caret.hidden = 1;
     Caret.on = FALSE;
     Caret.x = 0;
@@ -253,7 +253,7 @@
 BOOL WINAPI HideCaret( HWND hwnd )
 {
     if (!Caret.hwnd) return FALSE;
-    if (hwnd && (Caret.hwnd != hwnd)) return FALSE;
+    if (hwnd && (Caret.hwnd != WIN_GetFullHandle(hwnd))) return FALSE;
 
     TRACE("hwnd=%04x, hidden=%d\n",
                   hwnd, Caret.hidden);
@@ -280,7 +280,7 @@
 BOOL WINAPI ShowCaret( HWND hwnd )
 {
     if (!Caret.hwnd) return FALSE;
-    if (hwnd && (Caret.hwnd != hwnd)) return FALSE;
+    if (hwnd && (Caret.hwnd != WIN_GetFullHandle(hwnd))) return FALSE;
 
     TRACE("hwnd=%04x, hidden=%d\n",
 		hwnd, Caret.hidden);
diff --git a/windows/clipboard.c b/windows/clipboard.c
index 422d71f0..cc321e1 100644
--- a/windows/clipboard.c
+++ b/windows/clipboard.c
@@ -1366,7 +1366,7 @@
     else
 	WARN("hWndViewer is lost\n");
 
-    if( hWnd == hWndViewer ) hWndViewer = WIN_GetFullHandle( hWndNext );
+    if( WIN_GetFullHandle(hWnd) == hWndViewer ) hWndViewer = WIN_GetFullHandle( hWndNext );
 
     return bRet;
 }
diff --git a/windows/defwnd.c b/windows/defwnd.c
index f15d43e..73e6522 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -716,6 +716,7 @@
     LRESULT result = 0;
 
     if (!IsWindow( hwnd )) return 0;
+    hwnd = WIN_GetFullHandle( hwnd );
     SPY_EnterMessage( SPY_DEFWNDPROC, hwnd, msg, wParam, lParam );
 
     switch(msg)
@@ -845,6 +846,7 @@
     LRESULT result = 0;
 
     if (!IsWindow( hwnd )) return 0;
+    hwnd = WIN_GetFullHandle( hwnd );
     SPY_EnterMessage( SPY_DEFWNDPROC, hwnd, msg, wParam, lParam );
 
     switch(msg)
diff --git a/windows/dialog.c b/windows/dialog.c
index b950172..52ffd1a 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -1480,7 +1480,7 @@
         /* drop through */
 
     case WM_SYSCHAR:
-        if (DIALOG_IsAccelerator( hwnd, hwndDlg, wParam ))
+        if (DIALOG_IsAccelerator( WIN_GetFullHandle(hwnd), hwndDlg, wParam ))
         {
             /* don't translate or dispatch */
             return TRUE;
@@ -1516,8 +1516,8 @@
     {
        dlgCode = SendMessage16( msg->hwnd, WM_GETDLGCODE, 0, (LPARAM)msg16);
     }
-    ret = DIALOG_IsDialogMessage( msg->hwnd, hwndDlg, msg->message,
-                                  msg->wParam, msg->lParam,
+    ret = DIALOG_IsDialogMessage( WIN_Handle32(msg->hwnd), WIN_Handle32(hwndDlg),
+                                  msg->message, msg->wParam, msg->lParam,
                                   &translate, &dispatch, dlgCode );
     if (translate) TranslateMessage16( msg );
     if (dispatch) DispatchMessage16( msg );
@@ -1534,6 +1534,7 @@
     BOOL ret, translate, dispatch;
     INT dlgCode = 0;
 
+    hwndDlg = WIN_GetFullHandle( hwndDlg );
     if ((hwndDlg != msg->hwnd) && !IsChild( hwndDlg, msg->hwnd ))
         return FALSE;
 
@@ -1559,6 +1560,7 @@
     BOOL ret, translate, dispatch;
     INT dlgCode = 0;
 
+    hwndDlg = WIN_GetFullHandle( hwndDlg );
     if ((hwndDlg != msg->hwnd) && !IsChild( hwndDlg, msg->hwnd ))
         return FALSE;
 
@@ -2033,36 +2035,23 @@
         hChildFirst = GetWindow(hwndDlg,GW_CHILD);
         if(fPrevious) hChildFirst = GetWindow(hChildFirst,GW_HWNDLAST);
     }
-    else
+    else if (IsChild( hwndMain, hwndCtrl ))
     {
-        HWND hParent = GetParent(hwndCtrl);
-        BOOL bValid = FALSE;
-        while( hParent)
+        hChildFirst = GetWindow(hwndCtrl,wndSearch);
+        if(!hChildFirst)
         {
-            if(hParent == hwndMain)
+            if(GetParent(hwndCtrl) != hwndMain)
+                hChildFirst = GetWindow(GetParent(hwndCtrl),wndSearch);
+            else
             {
-                bValid = TRUE;
-                break;
-            }
-            hParent = GetParent(hParent);
-        }
-        if(bValid)
-        {
-            hChildFirst = GetWindow(hwndCtrl,wndSearch);
-            if(!hChildFirst)
-            {
-                if(GetParent(hwndCtrl) != hwndMain)
-                    hChildFirst = GetWindow(GetParent(hwndCtrl),wndSearch);
+                if(fPrevious)
+                    hChildFirst = GetWindow(hwndCtrl,GW_HWNDLAST);
                 else
-                {
-                    if(fPrevious)
-                        hChildFirst = GetWindow(hwndCtrl,GW_HWNDLAST);
-                    else
-                        hChildFirst = GetWindow(hwndCtrl,GW_HWNDFIRST);
-                }
+                    hChildFirst = GetWindow(hwndCtrl,GW_HWNDFIRST);
             }
-        }	
+        }
     }
+
     while(hChildFirst)
     {
         BOOL bCtrl = FALSE;
diff --git a/windows/mdi.c b/windows/mdi.c
index e0fd58f..6822b41 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -1292,10 +1292,10 @@
         else return 0;
 
       case WM_MDIDESTROY:
-          return MDIDestroyChild( hwnd, ci, (HWND)wParam, TRUE );
+          return MDIDestroyChild( hwnd, ci, WIN_GetFullHandle( (HWND)wParam ), TRUE );
 
       case WM_MDIGETACTIVE:
-          if (lParam) *(BOOL *)lParam = (ci->hwndChildMaximized > 0);
+          if (lParam) *(BOOL *)lParam = (ci->hwndChildMaximized != 0);
           return ci->hwndActiveChild;
 
       case WM_MDIICONARRANGE:
@@ -1310,7 +1310,7 @@
         return 0;
 
       case WM_MDINEXT: /* lParam != 0 means previous window */
-	MDI_SwitchActiveChild( hwnd, (HWND)wParam, !lParam );
+	MDI_SwitchActiveChild( hwnd, WIN_GetFullHandle( (HWND)wParam ), !lParam );
 	break;
 	
       case WM_MDIRESTORE:
@@ -1577,7 +1577,7 @@
     switch (message)
     {
     case WM_SETTEXT:
-        return DefMDIChildProcA( hwnd, message, wParam, (LPARAM)MapSL(lParam) );
+        return DefMDIChildProcA( WIN_Handle32(hwnd), message, wParam, (LPARAM)MapSL(lParam) );
     case WM_MENUCHAR:
     case WM_CLOSE:
     case WM_SETFOCUS:
@@ -1586,20 +1586,20 @@
     case WM_SETVISIBLE:
     case WM_SIZE:
     case WM_SYSCHAR:
-        return DefMDIChildProcW( hwnd, message, wParam, lParam );
+        return DefMDIChildProcW( WIN_Handle32(hwnd), message, wParam, lParam );
     case WM_GETMINMAXINFO:
         {
             MINMAXINFO16 *mmi16 = (MINMAXINFO16 *)MapSL(lParam);
             MINMAXINFO mmi;
             STRUCT32_MINMAXINFO16to32( mmi16, &mmi );
-            DefMDIChildProcW( hwnd, message, wParam, (LPARAM)&mmi );
+            DefMDIChildProcW( WIN_Handle32(hwnd), message, wParam, (LPARAM)&mmi );
             STRUCT32_MINMAXINFO32to16( &mmi, mmi16 );
             return 0;
         }
     case WM_NEXTMENU:
         {
             MDINEXTMENU next_menu;
-            DefMDIChildProcW( hwnd, message, wParam, (LPARAM)&next_menu );
+            DefMDIChildProcW( WIN_Handle32(hwnd), message, wParam, (LPARAM)&next_menu );
             return MAKELONG( next_menu.hmenuNext, next_menu.hwndNext );
         }
     default:
@@ -1617,6 +1617,7 @@
     HWND client = GetParent(hwnd);
     MDICLIENTINFO *ci = get_client_info( client );
 
+    hwnd = WIN_GetFullHandle( hwnd );
     if (!ci) return DefWindowProcA( hwnd, message, wParam, lParam );
 
     switch (message)
@@ -1653,6 +1654,7 @@
     HWND client = GetParent(hwnd);
     MDICLIENTINFO *ci = get_client_info( client );
 
+    hwnd = WIN_GetFullHandle( hwnd );
     if (!ci) return DefWindowProcW( hwnd, message, wParam, lParam );
 
     switch (message)
diff --git a/windows/timer.c b/windows/timer.c
index 79f1dbb..d40b2b3 100644
--- a/windows/timer.c
+++ b/windows/timer.c
@@ -12,6 +12,7 @@
 
 #include "winproc.h"
 #include "message.h"
+#include "win.h"
 #include "wine/server.h"
 #include "debugtools.h"
 
@@ -229,7 +230,7 @@
 {
     TRACE("%04x %d %d %08lx\n",
                    hwnd, id, timeout, (LONG)proc );
-    return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC16)proc,
+    return TIMER_SetTimer( WIN_Handle32(hwnd), id, timeout, (WNDPROC16)proc,
                            WIN_PROC_16, FALSE );
 }
 
@@ -242,7 +243,7 @@
 {
     TRACE("%04x %d %d %08lx\n",
                    hwnd, id, timeout, (LONG)proc );
-    return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC16)proc,
+    return TIMER_SetTimer( WIN_GetFullHandle(hwnd), id, timeout, (WNDPROC16)proc,
                            WIN_PROC_32A, FALSE );
 }
 
@@ -256,8 +257,9 @@
     TIMER *pTimer;
     BOOL ret = FALSE;
 
+    hwnd = WIN_GetFullHandle( hwnd );
     EnterCriticalSection( &csTimer );
-    
+
     for (i = 0, pTimer = TimersArray; i < NB_TIMERS; i++, pTimer++)
         if ((pTimer->hwnd == hwnd) && (pTimer->id == id) &&
             (pTimer->proc == hProc))
@@ -279,7 +281,7 @@
 {
     TRACE("%04x %d %d %08lx\n", 
                    hwnd, id, timeout, (LONG)proc );
-    return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC16)proc,
+    return TIMER_SetTimer( WIN_Handle32(hwnd), id, timeout, (WNDPROC16)proc,
                            WIN_PROC_16, TRUE );
 }
 
@@ -292,7 +294,7 @@
 {
     TRACE("%04x %d %d %08lx\n", 
                    hwnd, id, timeout, (LONG)proc );
-    return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC16)proc,
+    return TIMER_SetTimer( WIN_GetFullHandle(hwnd), id, timeout, (WNDPROC16)proc,
                            WIN_PROC_32A, TRUE );
 }
 
diff --git a/windows/win.c b/windows/win.c
index aa6162f..5684fb9 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -683,7 +683,7 @@
     DCE *dce;
     BOOL unicode = (type == WIN_PROC_32W);
 
-    TRACE("%s %s %08lx %08lx %d,%d %dx%d %04x %04x %08x %p\n",
+    TRACE("%s %s ex=%08lx style=%08lx %d,%d %dx%d parent=%04x menu=%04x inst=%08x params=%p\n",
           (type == WIN_PROC_32W) ? debugres_w((LPWSTR)cs->lpszName) : debugres_a(cs->lpszName),
           (type == WIN_PROC_32W) ? debugres_w((LPWSTR)cs->lpszClass) : debugres_a(cs->lpszClass),
           cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
@@ -1170,6 +1170,7 @@
     BOOL retvalue;
     HWND h;
 
+    hwnd = WIN_GetFullHandle( hwnd );
     TRACE("(%04x)\n", hwnd);
 
     /* Initialization */
@@ -1369,6 +1370,7 @@
 
     if (child)
     {
+        child = WIN_GetFullHandle( child );
         while (list[i] && list[i] != child) i++;
         if (!list[i]) return 0;
         i++;  /* start from next window */
@@ -1540,6 +1542,7 @@
         return USER_Driver.pEnableWindow( hwnd, enable );
 
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
+    hwnd = wndPtr->hwndSelf;  /* make it a full handle */
 
     retvalue = ((wndPtr->dwStyle & WS_DISABLED) != 0);
 
@@ -1550,7 +1553,7 @@
     }
     else if (!enable && !(wndPtr->dwStyle & WS_DISABLED))
     {
-        SendMessageA( wndPtr->hwndSelf, WM_CANCELMODE, 0, 0);
+        SendMessageA( hwnd, WM_CANCELMODE, 0, 0);
 
         wndPtr->dwStyle |= WS_DISABLED; /* Disable window */
 
@@ -2197,11 +2200,11 @@
  */
 HWND WINAPI GetAncestor( HWND hwnd, UINT type )
 {
-    HWND ret;
+    HWND ret = 0;
     WND *wndPtr;
 
-    if (hwnd == GetDesktopWindow()) return 0;
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
+    if (wndPtr->hwndSelf == GetDesktopWindow()) goto done;
 
     switch(type)
     {
@@ -2224,6 +2227,7 @@
         break;
     }
     ret = wndPtr ? wndPtr->hwndSelf : 0;
+ done:
     WIN_ReleaseWndPtr( wndPtr );
     return ret;
 }
@@ -2248,9 +2252,10 @@
     HWND retvalue;
 
     if (!parent) parent = GetDesktopWindow();
+    else parent = WIN_GetFullHandle( parent );
 
     /* sanity checks */
-    if (hwnd == GetDesktopWindow() || !IsWindow( parent ))
+    if (WIN_GetFullHandle(hwnd) == GetDesktopWindow() || !IsWindow( parent ))
     {
         SetLastError( ERROR_INVALID_WINDOW_HANDLE );
         return 0;
@@ -2315,6 +2320,7 @@
     BOOL ret;
 
     if (!list) return FALSE;
+    parent = WIN_GetFullHandle( parent );
     for (i = 0; list[i]; i++) if (list[i] == parent) break;
     ret = (list[i] != 0);
     HeapFree( GetProcessHeap(), 0, list );
@@ -2414,6 +2420,8 @@
 
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return 0;
+    hwnd = wndPtr->hwndSelf;  /* make it a full handle */
+
     switch(rel)
     {
     case GW_HWNDFIRST:
@@ -2883,6 +2891,7 @@
     TRACE("%04x\n", hWnd);
 
     if (!wndPtr) return FALSE;
+    hWnd = wndPtr->hwndSelf;  /* make it a full handle */
 
     if (wndPtr->dwStyle & WS_MINIMIZE)
     {
@@ -2910,8 +2919,8 @@
         if (bInvert) wparam = !(wndPtr->flags & WIN_NCACTIVATED);
         else wparam = (hWnd == GetActiveWindow());
 
-        SendMessageW( hWnd, WM_NCACTIVATE, wparam, (LPARAM)0 );
         WIN_ReleaseWndPtr(wndPtr);
+        SendMessageW( hWnd, WM_NCACTIVATE, wparam, (LPARAM)0 );
         return wparam;
     }
 }
diff --git a/windows/winpos.c b/windows/winpos.c
index 843864a..05b2d69 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -636,7 +636,7 @@
 {
     POINT offset;
 
-    WINPOS_GetWinOffset( hwndFrom, hwndTo, &offset );
+    WINPOS_GetWinOffset( WIN_Handle32(hwndFrom), WIN_Handle32(hwndTo), &offset );
     while (count--)
     {
 	lppt->x += offset.x;
@@ -654,7 +654,7 @@
 {
     POINT offset;
 
-    WINPOS_GetWinOffset( hwndFrom, hwndTo, &offset );
+    WINPOS_GetWinOffset( WIN_GetFullHandle(hwndFrom), WIN_GetFullHandle(hwndTo), &offset );
     while (count--)
     {
 	lppt->x += offset.x;
@@ -1641,10 +1641,12 @@
         }
     }
 
+    pWnd = WIN_FindWndPtr( hwnd );
+    hwnd = pWnd->hwndSelf;
+
     if( hwnd == hwndPrevActive )
         hwndPrevActive = 0;
 
-    pWnd = WIN_FindWndPtr( hwnd );
     if( hwndActive != hwnd &&
         ( hwndActive || QUEUE_IsExitingQueue(pWnd->hmemTaskQ)) )
     {
@@ -1698,14 +1700,14 @@
     if (!hWnd)
         return WINPOS_SetActiveWindow( 0, mouseMsg, TRUE );
 
-    wndPtr = WIN_FindWndPtr(hWnd);
-    if( !wndPtr ) return FALSE;
+    if (!(wndPtr = WIN_FindWndPtr(hWnd))) return FALSE;
+    hWnd = wndPtr->hwndSelf;
 
     /* child windows get WM_CHILDACTIVATE message */
     if( (wndPtr->dwStyle & (WS_CHILD | WS_POPUP)) == WS_CHILD )
     {
-        retvalue = SendMessageA(hWnd, WM_CHILDACTIVATE, 0, 0L);
-        goto end;
+        WIN_ReleaseWndPtr(wndPtr);
+        return SendMessageA(hWnd, WM_CHILDACTIVATE, 0, 0L);
     }
 
     if( hWnd == hwndActive )
@@ -1907,15 +1909,13 @@
     /* HWND parent; */
     WND *pWnd;
 
-    pDWP = (DWP *) USER_HEAP_LIN_ADDR( hdwp );
-    if (!pDWP) return 0;
+    hwnd = WIN_GetFullHandle( hwnd );
     if (hwnd == GetDesktopWindow()) return 0;
 
-    if (!(pWnd=WIN_FindWndPtr( hwnd ))) {
-        USER_HEAP_FREE( hdwp );
-        return 0;
-    }
-    	
+    if (!(pDWP = USER_HEAP_LIN_ADDR( hdwp ))) return 0;
+
+    if (!(pWnd = WIN_FindWndPtr( hwnd ))) return 0;
+
 /* Numega Bounds Checker Demo dislikes the following code.
    In fact, I've not been able to find any "same parent" requirement in any docu
    [AM 980509]