# 34.2. `msvcrt` — 来自 MS VC++ 运行时的有用例程

这些函数提供了对 Windows 平台上一些有用功能的访问。一些更高级别的模块使用这些函数来构建其服务的 Windows 实现。 例如， `getpass` 模块在实现 `getpass()` 函数时使用了这些函数。

关于这些函数的更多信息可以在平台 API 文档中找到。

该模块实现了控制台 I/O API 的普通和宽字符变体。普通的 API 只处理ASCII字符，国际化应用受限。应该尽可能地使用宽字符 API 。

3.3 版更變: Operations in this module now raise `OSError` where `IOError` was raised.

## 34.2.1. File Operations

`msvcrt.``locking`(fd, mode, nbytes)

  Lock part of a file based on file descriptor fd from the C runtime. Raises `OSError` on failure. The locked region of the file extends from the current file position for nbytes bytes, and may continue beyond the end of the file. mode must be one of the `LK_*` constants listed below. Multiple regions in a file may be locked at the same time, but may not overlap. Adjacent regions are not merged; they must be unlocked individually.

`msvcrt.``LK_LOCK`
`msvcrt.``LK_RLCK`

  Locks the specified bytes. If the bytes cannot be locked, the program immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, `OSError` is raised.

`msvcrt.``LK_NBLCK`
`msvcrt.``LK_NBRLCK`

  Locks the specified bytes. If the bytes cannot be locked, `OSError` is raised.

`msvcrt.``LK_UNLCK`

  Unlocks the specified bytes, which must have been previously locked.

`msvcrt.``setmode`(fd, flags)

  Set the line-end translation mode for the file descriptor fd. To set it to text mode, flags should be `os.O_TEXT`; for binary, it should be `os.O_BINARY`.

`msvcrt.``open_osfhandle`(handle, flags)

  Create a C runtime file descriptor from the file handle handle. The flags parameter should be a bitwise OR of `os.O_APPEND`, `os.O_RDONLY`, and `os.O_TEXT`. The returned file descriptor may be used as a parameter to `os.fdopen()` to create a file object.

`msvcrt.``get_osfhandle`(fd)

  Return the file handle for the file descriptor fd. Raises `OSError` if fd is not recognized.

## 34.2.2. Console I/O

`msvcrt.``kbhit`()

  Return true if a keypress is waiting to be read.

`msvcrt.``getch`()

  Read a keypress and return the resulting character as a byte string. Nothing is echoed to the console. This call will block if a keypress is not already available, but will not wait for `Enter` to be pressed. If the pressed key was a special function key, this will return `'\000'` or `'\xe0'`; the next call will return the keycode. The `Control-C` keypress cannot be read with this function.

`msvcrt.``getwch`()

  Wide char variant of `getch()`, returning a Unicode value.

`msvcrt.``getche`()

  Similar to `getch()`, but the keypress will be echoed if it represents a printable character.

`msvcrt.``getwche`()

  Wide char variant of `getche()`, returning a Unicode value.

`msvcrt.``putch`(char)

  Print the byte string char to the console without buffering.

`msvcrt.``putwch`(unicode_char)

  Wide char variant of `putch()`, accepting a Unicode value.

`msvcrt.``ungetch`(char)

  Cause the byte string char to be 「pushed back」 into the console buffer; it will be the next character read by `getch()` or `getche()`.

`msvcrt.``ungetwch`(unicode_char)

  Wide char variant of `ungetch()`, accepting a Unicode value.

## 34.2.3. Other Functions

`msvcrt.``heapmin`()

  Force the `malloc()` heap to clean itself up and return unused blocks to the operating system. On failure, this raises `OSError`.