windows_win/raw/
message.rs

1//! Provides functions to handle windows messages.
2
3use core::{mem, ptr};
4
5use crate::sys::*;
6use crate::utils::{self, Result};
7
8///Retrieves a message from the calling thread's message queue. A blocking call.
9///
10///# Parameters:
11///
12///* ```window``` - A handle to the window whose messages are to be retrieved. The window must belong to the current thread.
13///* ```range_low``` - Integer value of the lowest message to retrieve.
14///* ```range_high``` - Integer value of the highest message to retrieve.
15///
16///# Return
17///
18///* ```Ok``` - Successfully retrieved message..
19///* ```Err``` - Impossible to retrieve message.
20pub fn get(window: Option<HWND>, range_low: Option<UINT>, range_high: Option<UINT>) -> Result<MSG> {
21    let mut msg: MSG = unsafe { mem::zeroed() };
22
23    let result = unsafe { GetMessageW(&mut msg as LPMSG,
24                                      window.unwrap_or(ptr::null_mut()),
25                                      range_low.unwrap_or(0),
26                                      range_high.unwrap_or(0)) };
27
28    if result < 0 {
29        Err(utils::get_last_error())
30    }
31    else {
32        Ok(msg)
33    }
34}
35
36///Retrieves a message from the calling thread's message queue.
37///
38///A non-blocking version of [get()](fn.get.html).
39///
40///If no message presents in queue then returns None.
41///
42///# Parameters:
43///
44///* ```window``` - A handle to the window whose messages are to be retrieved. The window must belong to the current thread.
45///* ```range_low``` - Integer value of the lowest message to retrieve.
46///* ```range_high``` - Integer value of the highest message to retrieve.
47///* ```handle_type``` - Determines how retrieved message is handled. See [details](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644943(v=vs.85).aspx)
48///
49///# Return
50///
51///* ```Ok``` - Successfully retrieved message..
52///* ```Err``` - Impossible to retrieve message.
53pub fn peek(window: Option<HWND>, range_low: Option<UINT>, range_high: Option<UINT>, handle_type: Option<UINT>) -> Result<Option<MSG>> {
54    let mut msg: MSG = unsafe { mem::zeroed() };
55
56    let result = unsafe { PeekMessageW(&mut msg as LPMSG,
57                                       window.unwrap_or(ptr::null_mut()),
58                                       range_low.unwrap_or(0),
59                                       range_high.unwrap_or(0),
60                                       handle_type.unwrap_or(0)) };
61
62    if result < 0 {
63        Err(utils::get_last_error())
64    }
65    else if result == 0 {
66        Ok(None)
67    }
68    else {
69        Ok(Some(msg))
70    }
71}
72
73#[inline]
74///Translates virtual-key messages into character messages.
75///
76///The character messages are posted to the calling thread's message queue.
77///
78///# Parameters:
79///
80///* ```msg``` - Pointer to message retrieved by [get()](fn.get.html) or [peek()](fn.peek.html).
81///
82///# Return
83///
84///* ```true``` - Translation happened.
85///* ```false``` - Otherwise.
86pub fn translate(msg: LPMSG) -> bool {
87    unsafe {
88        TranslateMessage(msg) != 0
89    }
90}
91
92#[inline]
93///Dispatches a message to a window procedure.
94///
95///# Parameters:
96///
97///* ```msg``` - Pointer to message retrieved by [get()](fn.get.html) or [peek](fn.peek.html).
98///
99///# Return:
100///
101///Integer value whose meaning depends on dispatched messaged. Can be ignored.
102pub fn dispatch(msg: LPMSG) -> LRESULT {
103    unsafe {
104        DispatchMessageW(msg)
105    }
106}