【问题标题】:Get Key State Function with out using DLL在不使用 DLL 的情况下获取关键状态函数
【发布时间】:2011-11-03 04:52:27
【问题描述】:

我需要 vb.net Getkeystate Function() 的代码而不使用任何 DLL。我是从 vb 到 vb.net 的 API 转换的初学者。在 vb6 中他们使用 user32 DLL。在 Vb.Net 中我需要调用 Getkeystate 函数没有那个“User32.dll”功能。任何人都可以在不使用 dll 的情况下向我发布代码吗? 有没有办法在不使用 vb.net 中的那个 dll Getkeystate 函数的情况下获得关键状态?如果任何人知道等价的意思是告诉我代码。那些代码应该在.net框架中使用。

vb:

Private Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer
Dim keystate As Long
keystate = GetKeyState(27)
MsgBox keystate

vb.net

Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
On Error Resume Next
Dim KeyState As Long
KeyState = GetAsyncKeyState(17)
MsgBox(KeyState

【问题讨论】:

  • 什么样的应用程序? WPF、WinForms、控制台?
  • Windows 应用程序(获取转义键状态)
  • 要求无 DLL 解决方案没有任何意义,因为这正是它所需要的。您的声明是错误的,请在 pinvoke.net 获取正确的声明
  • 哎呀,上面的代码对我有用。这里我展示的示例代码就是这样。但在我的项目中,我被正确声明了。它正在工作。
  • 您的应用程序已经使用了 user32。没有它,您将无法与用户交互。你应该学习一些windows的基础知识。

标签: .net vb.net winapi pinvoke


【解决方案1】:

您要么需要调用 Windows API - 我不确定从你的问题中你是否理解使用 DLL/调用 Windows API 的含义。 User32.dll 是部分窗口,在其中调用函数实际上是要求窗口为您执行函数。您是要替换函数还是仅仅将调用转换为 vb.net?

如果您只需要将调用转换为 vb.net,您可以使用PInvoke 调用 windows API。

这是该页面的示例:

<DllImport("user32.dll", SetLastError := True, CharSet := CharSet.Unicode)> _
Private Function GetKeyState (ByVal nVirtKey As KeyStates) As Short
End Function

Imports System.Windows.Forms
Public Class MinhaNovaTextbox
    Inherits System.Windows.Forms.TextBox

    Dim bInserting As Boolean = True

    Private Declare Function GetKeyState _
        Lib "user32" (ByVal nVirtKey As Short) As Integer

    Public Sub New()
        MyBase.New()
        bInserting = GetKeyState(Keys.Insert)
    End Sub

    Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
        bInserting = GetKeyState(Keys.Insert)
        If Not bInserting Then
            Me.SelectionLength = 1
        End If
        MyBase.OnKeyPress(e)
    End Sub
End Class

【讨论】:

  • 嗨 preet... 我不希望 Dll 导入和所有。代码应该在 .net 框架中使用。不使用 dll Getkeystate 函数。在 vb.net 中是否有任何等效的 dll Getkeystate 函数。我在问...如何在不使用该 dll 函数的情况下获得关键状态。
  • 你为什么不想使用那个功能?
【解决方案2】:

对于 17,Control (Ctrl) 键,使用My.Computer.Keyboard.CtrlKeyDown

您也可以使用System.Windows.Forms.Control.ModifierKeys 或使用Keyboard 类。但是,使用My 命名空间要容易得多。

对于 27,Escape (Esc) 键,您必须使用 Windows API 调用。见GetKeyState函数http://msdn.microsoft.com/en-us/library/ms646301.aspx

System.Windows.Form.Form 并不真正需要检查 Esc。只需添加一个“取消”按钮并设置表单的CancelButton 属性。如果您需要更多控制,则处理其中一个 Key 事件; KeyUpKeyDownKeyPressPreviewKeyDown

【讨论】:

  • 我正在使用 Windows 应用程序来获取转义键状态。
  • @R1,使用答案中的链接。
  • Missico.. 我已经访问过该页面。有答案。但他们使用 DLL 导入 User32.dll。有什么方法可以在不使用该 dll 的情况下获得 Escape(27) 键状态...?框架里有可能吗..?
  • 我不知道如何在不使用该 dll 函数的情况下为转义键实现该键状态。
  • @R1,对于 Escape 状态,您必须使用 GetKeyState。正如我所描述的,可以按 Escape 键。甚至 .NET Framework 也依赖于 Windows API 调用。尝试使用提供的 Key 事件。您应该能够通过这些事件做需要做的事情。如果没有,那么您必须使用 GetKeyState API 调用。
【解决方案3】:
System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key)

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2022-01-09
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多