⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 defwnd.c

📁 winNT技术操作系统,国外开放的原代码和LIUX一样
💻 C
📖 第 1 页 / 共 4 页
字号:
                if (LOWORD(lParam) < HTLEFT || LOWORD(lParam) > HTBOTTOMRIGHT)
                {
                    BOOL bResult;
                    if (bUnicode)
                    {
                        bResult = SendMessageW(GetParent(hWnd), WM_SETCURSOR,
                                               wParam, lParam);
                    }
                    else
                    {
                        bResult = SendMessageA(GetParent(hWnd), WM_SETCURSOR,
                                               wParam, lParam);
                    }
                    if (bResult)
                    {
                        return(TRUE);
                    }
                }
            }
            return (DefWndHandleSetCursor(hWnd, wParam, lParam, Style));
        }

        case WM_SYSCOMMAND:
            return (DefWndHandleSysCommand(hWnd, wParam, lParam));

        case WM_KEYDOWN:
            if(wParam == VK_F10) iF10Key = VK_F10;
            break;

        /* FIXME: This is also incomplete. */
        case WM_SYSKEYDOWN:
        {
            if (HIWORD(lParam) & KEYDATA_ALT)
            {
             /* if( HIWORD(lParam) & ~KEYDATA_PREVSTATE ) */
                if ( (wParam == VK_MENU || wParam == VK_LMENU
                                    || wParam == VK_RMENU) && !iMenuSysKey )
                   iMenuSysKey = 1;
                else
                   iMenuSysKey = 0;
                                                                                           
                iF10Key = 0;

                if (wParam == VK_F4) /* Try to close the window */
                {
                    HWND top = GetAncestor(hWnd, GA_ROOT);
                    if (!(GetClassLongW(top, GCL_STYLE) & CS_NOCLOSE))
                    {
                        if (bUnicode)
                            PostMessageW(top, WM_SYSCOMMAND, SC_CLOSE, 0);
                        else
                            PostMessageA(top, WM_SYSCOMMAND, SC_CLOSE, 0);
                    }
                }
                else if (wParam == VK_SNAPSHOT)
                {
                    DefWndScreenshot(hWnd);
                }
            }
            else if( wParam == VK_F10 )
                iF10Key = 1;
            else if( wParam == VK_ESCAPE && (GetKeyState(VK_SHIFT) & 0x8000))
                SendMessageW( hWnd, WM_SYSCOMMAND, SC_KEYMENU, ' ' );
            break;
        }

        case WM_KEYUP:
        case WM_SYSKEYUP:
        {
           /* Press and release F10 or ALT */
            if (((wParam == VK_MENU || wParam == VK_LMENU || wParam == VK_RMENU)
                 && iMenuSysKey) || ((wParam == VK_F10) && iF10Key))
                SendMessageW( GetAncestor( hWnd, GA_ROOT ), WM_SYSCOMMAND, SC_KEYMENU, 0L );
            iMenuSysKey = iF10Key = 0;
            break;
        }

        case WM_SYSCHAR:
        {
            iMenuSysKey = 0;
            if (wParam == '\r' && IsIconic(hWnd))
            {
                PostMessageW( hWnd, WM_SYSCOMMAND, SC_RESTORE, 0L );
                break;
            }
            if ((HIWORD(lParam) & KEYDATA_ALT) && wParam)
            {
                if (wParam == '\t' || wParam == '\x1b') break;
                if (wParam == ' ' && (GetWindowLongW( hWnd, GWL_STYLE ) & WS_CHILD))
                    SendMessageW( GetParent(hWnd), Msg, wParam, lParam );
                else
                    SendMessageW( hWnd, WM_SYSCOMMAND, SC_KEYMENU, wParam );
            }
            else /* check for Ctrl-Esc */
                if (wParam != '\x1b') MessageBeep(0);
            break;
        }

        case WM_SHOWWINDOW:
        {
            LONG Style;
            INT Ret = 0;
            
            if (!lParam) return 0;
            Style = GetWindowLongW(hWnd, GWL_STYLE);
            if ((Style & WS_VISIBLE) && wParam) return 0;
            if (!(Style & WS_VISIBLE) && !wParam) return 0;
            if (!GetWindow(hWnd, GW_OWNER)) return 0;
            Ret = NtUserCallTwoParam((DWORD) hWnd, (DWORD) wParam, TWOPARAM_ROUTINE_ROS_SHOWWINDOW);
            if(Ret)
            {
                if( Ret == -1) return 0;
                return Ret;
            }
            ShowWindow(hWnd, wParam ? SW_SHOWNOACTIVATE : SW_HIDE);
            break;
        }

        case WM_CANCELMODE:
        {
            iMenuSysKey = 0;
            /* FIXME: Check for a desktop. */
            if (!(GetWindowLongW( hWnd, GWL_STYLE ) & WS_CHILD)) EndMenu();
            if (GetCapture() == hWnd)
            {
                ReleaseCapture();
            }
            break;
        }

        case WM_VKEYTOITEM:
        case WM_CHARTOITEM:
            return (-1);
/*
        case WM_DROPOBJECT:
            return DRAG_FILE;
*/
        case WM_QUERYDROPOBJECT:
        {
            if (GetWindowLongW(hWnd, GWL_EXSTYLE) & WS_EX_ACCEPTFILES)
            {
                return(1);
            }
            break;
        }

        case WM_QUERYDRAGICON:
        {
            UINT Len;
            HICON hIcon;

            hIcon = (HICON)GetClassLongW(hWnd, GCL_HICON);
            if (hIcon)
            {
                return ((LRESULT)hIcon);
            }
            for (Len = 1; Len < 64; Len++)
            {
                if ((hIcon = LoadIconW(NULL, MAKEINTRESOURCEW(Len))) != NULL)
                {
                    return((LRESULT)hIcon);
                }
            }
            return ((LRESULT)LoadIconW(0, IDI_APPLICATION));
        }

        /* FIXME: WM_ISACTIVEICON */

        case WM_NOTIFYFORMAT:
        {
            if (IsWindowUnicode(hWnd))
            {
                return(NFR_UNICODE);
            }
            else
            {
                return(NFR_ANSI);
            }
        }

        case WM_SETICON:
        {
           INT Index = (wParam != 0) ? GCL_HICON : GCL_HICONSM;
           HICON hOldIcon = (HICON)GetClassLongW(hWnd, Index);
           SetClassLongW(hWnd, Index, lParam);
           SetWindowPos(hWnd, 0, 0, 0, 0, 0,
		       SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |
		       SWP_NOACTIVATE | SWP_NOZORDER);
           return ((LRESULT)hOldIcon);
        }

        case WM_GETICON:
        {
            INT Index = (wParam == ICON_BIG) ? GCL_HICON : GCL_HICONSM;
            return (GetClassLongW(hWnd, Index));
        }

        case WM_HELP:
        {
            if (bUnicode)
            {
                SendMessageW(GetParent(hWnd), Msg, wParam, lParam);
            }
            else
            {
                SendMessageA(GetParent(hWnd), Msg, wParam, lParam);
            }
            break;
        }

        case WM_SYSTIMER:
        {
          THRDCARETINFO CaretInfo;
          switch(wParam)
          {
            case 0xffff: /* Caret timer */
              /* switch showing byte in win32k and get information about the caret */
              if(NtUserSwitchCaretShowing(&CaretInfo) && (CaretInfo.hWnd == hWnd))
              {
                DrawCaret(hWnd, &CaretInfo);
              }
              break;
          }
          break;
        }

        case WM_QUERYOPEN:
        case WM_QUERYENDSESSION:
        {
            return (1);
        }

        case WM_ENDSESSION:
            if (wParam) PostQuitMessage(0);
            return 0;

    }
    return 0;
}


LRESULT STDCALL
DefWindowProcA(HWND hWnd,
	       UINT Msg,
	       WPARAM wParam,
	       LPARAM lParam)
{
    LRESULT Result = 0;

    SPY_EnterMessage(SPY_DEFWNDPROC, hWnd, Msg, wParam, lParam);
    switch (Msg)
    {
        case WM_NCCREATE:
        {
            ANSI_STRING AnsiString;
            UNICODE_STRING UnicodeString;
            LPCREATESTRUCTA cs = (LPCREATESTRUCTA)lParam;
            /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
             * may have child window IDs instead of window name */

            if(cs->lpszName)
            {
              RtlInitAnsiString(&AnsiString, (LPSTR)cs->lpszName);
              RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
              NtUserDefSetText(hWnd, &UnicodeString);
              RtlFreeUnicodeString(&UnicodeString);
            }
            else
              NtUserDefSetText(hWnd, NULL);

            Result = 1;
            break;
        }

        case WM_GETTEXTLENGTH:
        {
            Result = (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0);
            break;
        }

        case WM_GETTEXT:
        {
            LPWSTR Buffer;
            LPSTR AnsiBuffer = (LPSTR)lParam;
            INT Length;

            Buffer = HeapAlloc(GetProcessHeap(), 0, wParam * sizeof(WCHAR));
            if (!Buffer)
            {
                Result = 0;
                break;
            }
            Length = NtUserInternalGetWindowText(hWnd, Buffer, wParam);
            if (Length > 0 && wParam > 0 &&
                !WideCharToMultiByte(CP_ACP, 0, Buffer, -1,
                AnsiBuffer, wParam, NULL, NULL))
            {
                AnsiBuffer[0] = '\0';
            }

            HeapFree(GetProcessHeap(), 0, Buffer);

            Result = (LRESULT)Length;
            break;
        }

        case WM_SETTEXT:
        {
            ANSI_STRING AnsiString;
            UNICODE_STRING UnicodeString;

            if(lParam)
            {
              RtlInitAnsiString(&AnsiString, (LPSTR)lParam);
              RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
              NtUserDefSetText(hWnd, &UnicodeString);
              RtlFreeUnicodeString(&UnicodeString);
            }
            else
              NtUserDefSetText(hWnd, NULL);

            if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION)
            {
                DefWndNCPaint(hWnd, (HRGN)1, -1);
            }

            Result = 1;
            break;
        }

/*      FIXME: Implement these. */
        case WM_IME_CHAR:
        case WM_IME_KEYDOWN:
        case WM_IME_KEYUP:
        case WM_IME_STARTCOMPOSITION:
        case WM_IME_COMPOSITION:
        case WM_IME_ENDCOMPOSITION:
        case WM_IME_SELECT:
        case WM_IME_SETCONTEXT:
            DPRINT1("FIXME: WM_IME_* conversion isn't implemented yet!");
        /* fall through */
        default:
            Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, FALSE);
    }

    SPY_ExitMessage(SPY_RESULT_DEFWND, hWnd, Msg, Result, wParam, lParam);
    return Result;
}


LRESULT STDCALL
DefWindowProcW(HWND hWnd,
	       UINT Msg,
	       WPARAM wParam,
	       LPARAM lParam)
{
    LRESULT Result = 0;

    SPY_EnterMessage(SPY_DEFWNDPROC, hWnd, Msg, wParam, lParam);
    switch (Msg)
    {
        case WM_NCCREATE:
        {
            UNICODE_STRING UnicodeString;
            LPCREATESTRUCTW cs = (LPCREATESTRUCTW)lParam;
            /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
             * may have child window IDs instead of window name */

            if(cs->lpszName)
              RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName);

            NtUserDefSetText( hWnd, (cs->lpszName ? &UnicodeString : NULL));
            Result = 1;
            break;
        }

        case WM_GETTEXTLENGTH:
        {
            Result = (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0);
            break;
        }

        case WM_GETTEXT:
        {
            Result = (LRESULT)NtUserInternalGetWindowText(hWnd, (PWSTR)lParam, wParam);
            break;
        }

        case WM_SETTEXT:
        {
            UNICODE_STRING UnicodeString;

            if(lParam)
              RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam);

            NtUserDefSetText(hWnd, (lParam ? &UnicodeString : NULL));

            if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION)
            {
                DefWndNCPaint(hWnd, (HRGN)1, -1);
            }
            Result = 1;
            break;
        }

        case WM_IME_CHAR:
        {
            SendMessageW(hWnd, WM_CHAR, wParam, lParam);
            Result = 0;
            break;
        }

        case WM_IME_SETCONTEXT:
        {
            /* FIXME */
            DPRINT1("FIXME: WM_IME_SETCONTEXT is not implemented!");
            Result = 0;
            break;
        }

        default:
            Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, TRUE);
    }
    SPY_ExitMessage(SPY_RESULT_DEFWND, hWnd, Msg, Result, wParam, lParam);

    return Result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -