2013-08-16 56 views
8

Có nhiều lúc tôi đang cố gắng để bắt Ctrl +Alt +Ngay Shift dưới xử lý chủ chốt VBNET chung. Dưới đây là các bài kiểm tra của tôi:Làm thế nào để bắt Ctrl + Alt + RShftKey

If e.Control And e.Alt And e.KeyCode = Keys.Space Then 
     MsgBox("CTRL + ALT + SPACE") ' This work 
    End If 

    If e.Control And e.Shift And e.KeyCode = Keys.F10 Then 
     MsgBox("CTRL + SHIFT + F10") ' This work 
    End If 

    If e.Control And e.Alt And e.KeyCode = Keys.ShiftKey Then 
     MsgBox("CTRL + ALT + SHIFT") ' This work 
    End If 

    If e.Alt And e.Shift And e.KeyCode = Keys.LWin Then 
     MsgBox("ALT + SHIFT + LEFT WINDOWS") ' This work 
    End If 

    If e.Control And e.Alt And e.KeyCode = Keys.RShiftKey Then 
     MsgBox("CTRL + ALT + RIGHT SHIFT") ' This don't work 
    End If 

Windows 7, WinForms, VB2008, NET framework 2.0

Tại sao tôi không thể bắt Ctrl +Alt +Ngay Shift trong tình huống được mô tả?
Hoặc, làm thế nào để tôi bắt được Ctrl + Alt + Phím Shift phải kết hợp?

Trả lời

6

Không có cách nào để phát hiện sự khác biệt giữa các ca sử dụng phương pháp tiếp cận VB.NET chuẩn. Bạn sẽ phải móc vào Windows API cho rằng:

<System.Runtime.InteropServices.DllImport("user32.dll")> _ 
    Private Shared Function GetAsyncKeyState(vKey As Keys) As Short 
    End Function 

    Private Sub Form2_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 

     If e.Control And e.Alt And e.Shift Then 

      If Convert.ToBoolean(GetAsyncKeyState(Keys.LShiftKey)) Then 
       MsgBox("CTRL + ALT + LEFT SHIFT") 
      ElseIf Convert.ToBoolean(GetAsyncKeyState(Keys.RShiftKey)) Then 
       MsgBox("CTRL + ALT + RIGHT SHIFT") 
      End If 

     End If 

    End Sub 
+0

Rất thú vị. Tại sao RShiftKey và LShiftKey lại được liệt kê dưới các hằng số Keys? Tương tự áp dụng cho LControlKey và RControlKey? Điều gì khác không hoạt động như mong đợi? –

+0

Cập nhật câu trả lời của tôi cho giải pháp khả thi - đây là nơi bạn sử dụng những mã được liệt kê –

+0

Nó có vấn đề. Nhấn một phím khác tùy ý sau khi giữ ba phím xuống và thấy rằng nó kích hoạt hộp tin nhắn. –

3

Vâng, đây là khó khăn vì đây là tất cả các phím modifier và người dùng có thể nhấn họ trong bất kỳ thứ tự. Bạn sẽ cần phải thực hiện một số tính năng lọc để đảm bảo rằng một lần nhấn phím thứ 4 không tạo lại kết quả trùng khớp, một vấn đề với câu trả lời được chấp nhận. Và phím shift phải rất khó, nó được báo cáo là Keys.Shift khi nhấn. Điều đó đòi hỏi phải có pinvoke để kiểm tra xem phím có bị hỏng hay không.

này làm việc tốt:

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown 
    If Control.ModifierKeys = (Keys.Control Or Keys.Alt Or Keys.Shift) Then 
     If e.KeyCode = Keys.ControlKey Or e.KeyCode = Keys.Menu Or e.KeyCode = Keys.ShiftKey Then 
      If GetKeyState(Keys.RShiftKey) < 0 And GetKeyState(Keys.LShiftKey) >= 0 Then 
       MessageBox.Show("yada") 
      End If 
     End If 
    End If 
End Sub 

Private Declare Function GetKeyState Lib "user32.dll" (ByVal key As Keys) As Short 

này hoạt động bằng cách đầu tiên xác minh rằng cả ba phím modifier là xuống. Sau đó, nó kiểm tra rằng phím cuối cùng đã được nhấn là một trong của ba khóa, tính năng lọc đảm bảo bạn không nhận được quá nhiều kết quả phù hợp. Cuối cùng nó sẽ kiểm tra nếu phím shift phải là xuống và nó đã không đạt được điều đó bằng cách nhấn phím shift trái.

+0

Cảm ơn Hans, ví dụ của bạn cũng hoạt động như mong đợi nhưng Yuri trả lời trước. –

+0

Nó không phải là câu trả lời tương tự. –

+0

Tất nhiên là không nhưng cả hai đều dựa trên user32.dll và GetKeyState nổi tiếng. Bạn có nghĩ rằng giải pháp của Yuri không đủ tốt? Bằng cách kiểm tra nó hoạt động tốt. –

1

Hãy xem này:

If e.Control And e.Alt And e.KeyCode = Keys.ShiftKey Then 
     MsgBox("CTRL + ALT + SHIFT") ' This work 
     Debug.Print("CTRL + ALT + SHIFT" & GetAsyncKeyState(Keys.ShiftKey) & GetAsyncKeyState(Keys.RShiftKey)) 
    End If 

    If e.Control And e.Alt And e.KeyCode = Keys.RShiftKey Then 
     MsgBox("CTRL + ALT + RIGHT SHIFT") ' This don't work 
     Debug.Print("CTRL + ALT + RIGHT SHIFT " & GetAsyncKeyState(Keys.ShiftKey) & GetAsyncKeyState(Keys.RShiftKey)) 
    End If 

Bạn sẽ thấy rằng giá trị cho Keys.ShiftKey là như nhau cho trái và phải. Các kiểm tra cho Keys.RShiftKey thay đổi. DECLARE từ trên là bắt buộc đối với cuộc gọi API.

+0

Thử nghiệm thú vị mang lại "khả thi": Nếu e.Control Và e.Alt Và GetAsyncKeyState (Keys.RShiftKey) Sau đó ... –

Các vấn đề liên quan