2016-07-20 11 views
0
私は chars()メソッドを使用できるように Read特色に ReadConsoleInputW Windowsコンソールメソッドをラップしたいが、私は、キー修飾子が適用されているかを知ることも必要

制御ALT/メタ)。 (Unixのコンソールによって使用されるものなど)ReadConsoleInputWラッパーと所有権

一つの解決策は、制御文字またはANSIエスケープコードにキーイベントを符号化することです。

struct InputBuffer { 
    handle: winapi::HANDLE, 
    ctrl: bool, 
    meta: bool, 
} 

impl Read for InputBuffer { 
    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { 
     let mut rec: winapi::INPUT_RECORD = unsafe { mem::zeroed() }; 
     // kernel32::ReadConsoleInputW(self.0, &mut rec, 1 as winapi::DWORD, &mut count); 
     // ... 
     if rec.EventType != winapi::KEY_EVENT { 
      continue; 
     } 
     let key_event = unsafe { rec.KeyEvent() }; 
     // ... 
     self.ctrl = key_event.dwControlKeyState & 
         (winapi::LEFT_CTRL_PRESSED | winapi::RIGHT_CTRL_PRESSED) == 
         (winapi::LEFT_CTRL_PRESSED | winapi::RIGHT_CTRL_PRESSED); 
     self.meta = ...; 

     let utf16 = key_event.UnicodeChar; 
     // ... 
     let (bytes, len) = try!(InputBuffer::wide_char_to_multi_byte(utf16)); 
     return (&bytes[..len]).read(buf); 
    } 
} 

fn main() { 
    let handle = try!(get_std_handle(STDIN_FILENO)); 
    let mut stdin = InputBuffer(handle); 
    let mut chars = stdin.chars(); // stdin moved here 
    loop { 
     let c = chars.next().unwrap(); 
     let mut ch = try!(c); 
     if stdin.ctrl { // use of moved value 
      //... 
     } 
     // ... 
    } 
} 

ルーストにこれを実行する方法:?chars()方法は、入力を移動/消費ので

別の解決策は、周りの修飾キーを保つことが、私はそれを動作させることができないだろうか

答えて

0

あなたはRc<RefCell<somestruct>>にこれらのフラグを入れて、stdinを消費する前にそれを複製することができます。

これは、2つの場所から、同じデータへの「アクセス」を持つことを可能にする一般的なパターンです。あなたは、重複アクセスを持っていない場合Rcは、共有所有権の世話をし、RefCellチェック。

関連する問題