2010-05-24 36 views
11

Làm cách nào để chuyển đổi khóa dấu chéo ngược ('\') thành mã khóa?Làm thế nào để chuyển đổi một ký tự thành mã khóa?

Bật code xuyệc ngược bàn phím của tôi là 220, nhưng các phương pháp dưới đây

(int)'\\' 

trả về cho tôi 92.

Tôi cần một số chuyển đổi chung chung như

int ConvertCharToKeyValue(char c) 
{ 
    // some code here... 
} 

Bất kỳ ý tưởng?

+0

Bạn đã bao giờ giải quyết vấn đề này thành công chưa? Bạn vẫn cần trợ giúp với điều này? – jcolebrand

+0

Bạn đã thấy câu trả lời này chưa? http://stackoverflow.com/questions/318777/c-how-to-translate-virtual-keycode-to-char – jcolebrand

+0

Có. Tôi cần chuyển đổi từ char sang int. Và tôi cần một giải pháp nền tảng riêng. Nếu không có WM_Messages ... –

Trả lời

0

Không có chức năng nào mà tôi biết sẽ vẽ bản đồ ký tự cho mã khóa ảo. Tuy nhiên, bạn có thể sử dụng bảng sau để bắt đầu xây dựng bản đồ như vậy.

http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx.

Lưu ý rằng bạn sẽ cần phải biết bàn phím, nhìn vào phím bạn đề cập '\' đây là khóa ảo VK_OEM_5 cho bàn phím US là '\' nếu không được dịch chuyển và '|' nếu được dịch chuyển, vì vậy chức năng của bạn sẽ cần biết bàn phím cũng được sử dụng.

Tất nhiên nếu bạn muốn ánh xạ từ mã khóa ảo sang ký tự, bạn có thể sử dụng interop để gọi hàm MapVirtualKeyEx.

Cập nhật Dựa trên nhận xét của bạn, điều này sẽ cung cấp cho bạn những gì bạn muốn.

[DllImport("user32.dll")] 
static extern int MapVirtualKey(int uCode, uint uMapType); 

const uint MAPVK_VK_TO_CHAR = 0x02; 

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    int key = MapVirtualKey((int)e.KeyCode, MAPVK_VK_TO_CHAR); 
    if (key == (int)'\\') 
    { 

    } 
} 
+0

Cảm ơn bạn đã liên kết.Tôi đọc: VK_OEM_5: 0xDC: 220 Được sử dụng cho các ký tự khác; nó có thể khác nhau tùy theo bàn phím. ~~~~~~~~~~~~~~~~~~~~~~~ Đối với bàn phím chuẩn của Hoa Kỳ, '\ |' phím Tôi cần giải pháp không có bàn phím. Có lẽ là giải pháp tốt nhất sẽ là một cái gì đó như: public void TextBox_KeyDown (object sender, KeyEventArgs e) { if ((String.Parse (e.KeyCode) .EndsWith ("\\")) ... } –

+0

@Murat, không có hàm String.Parse() Tôi đã thêm một mẫu có thể trợ giúp với những gì bạn muốn làm ở đây –

16

Bạn có thể P/Gọi VkKeyScan() để chuyển đổi mã khóa nhập trở lại khóa ảo. Hãy coi chừng rằng trạng thái của phím bổ trợ là quan trọng, nhận được "|" yêu cầu giữ phím shift trên bố trí bàn phím của tôi. Chữ ký chức năng của bạn không cho phép điều này vì vậy tôi vừa tạo một cái gì đó lên:

public static Keys ConvertCharToVirtualKey(char ch) { 
     short vkey = VkKeyScan(ch); 
     Keys retval = (Keys)(vkey & 0xff); 
     int modifiers = vkey >> 8; 
     if ((modifiers & 1) != 0) retval |= Keys.Shift; 
     if ((modifiers & 2) != 0) retval |= Keys.Control; 
     if ((modifiers & 4) != 0) retval |= Keys.Alt; 
     return retval; 
    } 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    private static extern short VkKeyScan(char ch); 

Cũng cần lưu ý bố cục bàn phím cần sử dụng phím chết (Alt + Gr) để tạo phím nhập. Loại mã này thực sự là tốt nhất nên tránh.

1

Nếu

var char = System.Windows.Forms.Keys.OemPipe; // 220 
var code = (int)char; 

sau đó

public static int ToKeyValue(this char ch) 
{ 
    return (int)(System.Windows.Forms.Keys)ch; 
} 
+0

Tôi đã có ấn tượng rằng 'OemPipe' sẽ là' | 'và' OemBackslash' sẽ là '\\' – Powerlord

+0

@R.Bemrose: Vâng, nhưng khi tôi nhấn '\' trên bàn phím (nằm dưới Backspace và ở trên) hộp kiểm thử nghiệm của tôi kích hoạt sự kiện 'KeyUp' trong đó' KeyCode = 220' OP đang tìm kiếm – abatishchev

0

Hoặc bạn có thể giữ cho nó đơn giản và cast nó.

(Keys)keyToConvert 
Các vấn đề liên quan