vba - 在宏运行结束时打开 NUMLOCK

标签 vba excel

代码的作用:我有一段代码,可以在屏幕上移动鼠标、打印屏幕并将其粘贴到 Excel 中。

问题:由于某种原因,我的代码总是(绝对没有异常(exception))在每次运行后关闭 NUMLOCK 键。

到目前为止我尝试过的:我四处搜索并找到了 SendKeys (NUMLOCK),理论上它是有效的(尽管这对用户来说似乎是一个很大的问题)。

我想要做什么:我想在每次宏运行后打开 NUMLOCK,

Obs1:我不知道是什么导致宏首先将其关闭。修复导致此问题的任何原因将是理想的选择,但由于我不知道问题是什么,所以我首先想让我的代码正常运行。一旦找到打开 NUMLOCK 键的方法,我就会着手解决这个问题。

问题:我可以使用 SendKeys 执行此操作吗?我使用得当吗?有更好的办法吗?

Obs2:由于它是一个更大的代码,一旦解决了这个问题,我将发布另一个包含整个代码的问题,并仔细研究导致问题的原因。

代码我正在尝试起诉以打开数字锁定:

Application.Sendkeys (NUMLOCK)

还尝试过:

Application.Sendkeys ("NUMLOCK")

Application.Sendkeys {NUMLOCK}

最佳答案

您可以通过几个 Windows API 调用直接设置键状态。移植自 MSDN page for keybd_event function :

#If VBA7 Then
    Private Declare PtrSafe Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, _
                                                              ByVal dwFlags As LongPtr, ByVal dwExtraInfo As LongPtr)
    Private Declare PtrSafe Function GetKeyboardState Lib "user32.dll" (ByVal lpKeyState As LongPtr) As Boolean
#Else
    Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, _
                                                      ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Private Declare Function GetKeyboardState Lib "user32.dll" (ByVal lpKeyState As Long) As Boolean
#End If  

Private Const KEYEVENTF_EXTENDEDKEY As Long = &H1
Private Const KEYEVENTF_KEYUP As Long = &H2
Private Const VK_NUMLOCK As Byte = &H90
Private Const NumLockScanCode As Byte = &H45

Private Sub ToggleNumlock(enabled As Boolean)
    Dim keystate(255) As Byte
    'Test current keyboard state.
    GetKeyboardState (VarPtr(keystate(0)))
    If (Not keystate(VK_NUMLOCK) And enabled) Or (keystate(VK_NUMLOCK) And Not enabled) Then
        'Send a keydown
        keybd_event VK_NUMLOCK, NumLockScanCode, KEYEVENTF_EXTENDEDKEY, 0&
        'Send a keyup
        keybd_event VK_NUMLOCK, NumLockScanCode, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0&
    End If
End Sub

这样调用它:

Sub Example()
    'Turn Numlock off.
    ToggleNumlock False
    'Turn Numlock on.
    ToggleNumlock True
End Sub

关于vba - 在宏运行结束时打开 NUMLOCK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42440776/

相关文章:

excel - 在另一个单元格中输入数据并按 Enter 选项后转到特定单元格

excel - 具有自定义列类型的导出 csv powershell

java - 如何使用java apache poi库在Excel中设置日期字段?

vba - 在 Excel 中使用 VBA 自定义功能区

vba - 用户定义的函数来改变单元格的颜色

excel - 将列转换为单元格字符串 Power Query

java - Cucumber Selenium 使用 Excel 文件作为数据表

excel - 自动继续公式

excel - 将 VBA 变量设置为字符串函数的结果

vba - 将表格列中的所有单元格设置为特定值