- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了一个模拟键盘事件的小程序,用于在 Oracle 中填充数据,但是当我使用 keybd_event 引入字符下划线时,输出是错误的如果 _ 不是最后一个字符,当程序模拟下一个字符时自动添加字符 -例子我需要录音 09_80对于下划线,我使用 VK_RSHIFT 和 VK_OEM_MINUS 的组合输出为 09_-80
有人可以帮助我吗?我也尝试过使用 InputSimulator,但它只在 Windows 8 上正常运行
下面是我程序中的一些代码行,提前致谢最好的问候
//键盘操作
[DllImport("user32.dll", SetLastError = true)]
public static extern void keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo);
[DllImport("user32.dll")]
public static extern int MapVirtualKey(int uCode, int uMapType);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern short VkKeyScan(char ch);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern string SendMessage(IntPtr hWnd, int msg, string wParam, IntPtr lParam);
public const int KEYEVENTF_EXTENDEDKEY = 0x0001;
public const int KEYEVENTF_KEYUP = 0x0002;
//发送字符
public static void SendChar(char c)
{
if (bw.CancellationPending)
{
return;
}
if(c=='_')
{
keysPress(VK_RSHIFT,VK_OEM_MINUS)
}
int vk = VkKeyScan(c);
int sc = MapVirtualKey(vk, 0);
PressKeyDn(vk, sc);
ReleaseKeyUp(vk, sc);
}
//SEND STRING
public static void SendString(string s)
{
foreach (char c in s)
{
SendChar(c);
}
}
//PRESS KEY DOWN
public static void PressKeyDn(int VK_Code, int SC_Code)
{
keybd_event(VK_Code, SC_Code, 0, 0);
}
//RELEASE KEY UP
public static void ReleaseKeyUp(int VK_Code, int SC_Code)
{
keybd_event(VK_Code, SC_Code, KEYEVENTF_KEYUP, 0);
}
//Press Special Key
public static void keyPress(int VK_key)
{
if (bw.CancellationPending)
{
return;
}
int sc = MapVirtualKey(VK_key, 0);
PressKeyDn(VK_key, sc);
ReleaseKeyUp(VK_key, sc);
}
//Press Special Key Combination 2 keys
public static void keysPress(int VK_Key1,int VK_Key2)
{
if (bw.CancellationPending)
{
return;
}
int sc1 = MapVirtualKey(VK_Key1, 0);
int sc2 = MapVirtualKey(VK_Key2, 0);
PressKeyDn(VK_Key1, sc1);
PressKeyDn(VK_Key2, sc2);
ReleaseKeyUp(VK_Key2, sc2);
ReleaseKeyUp(VK_Key1, sc1);
}
//Press Special Key Combination 3 keys
public static void keysPress(int VK_Key1, int VK_Key2,int VK_Key3)
{
if (bw.CancellationPending)
{
return;
}
int sc1 = MapVirtualKey(VK_Key1, 0);
int sc2 = MapVirtualKey(VK_Key2, 0);
int sc3 = MapVirtualKey(VK_Key3, 0);
PressKeyDn(VK_Key1, sc1);
PressKeyDn(VK_Key2, sc2);
PressKeyDn(VK_Key3, sc3);
ReleaseKeyUp(VK_Key3, sc3);
ReleaseKeyUp(VK_Key2, sc2);
ReleaseKeyUp(VK_Key1, sc1);
}
最佳答案
好的,经过一些测试,我发现了问题所在,并已修复。_(下划线)表示第二行语句的延续,因此下一个字符以 - 开头。我已经解决了这个问题,通过这种方式从方法中排除了下一个字符。
public static void SendChar(char c)
{
bool und = false;
if (c == '_')
{
und = true;
}
int vk = BMDLCommands.VkKeyScan(c);
int sc = BMDLCommands.MapVirtualKey(vk, 0);
if(und)
{
keysPress(VK_SHIFT, VK_OEM_MINUS);
MethodInvoker met = delegate
{
keyPress(vk);
};
}
else
{
BMDLCommands.PressKeyDn(vk, sc);
BMDLCommands.ReleaseKeyUp(vk, sc);
}
}
现在输出完全正确。非常感谢您的帮助
关于c# - Keybd_event 下划线提供错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38771514/
我正在开发 Windows CE 的虚拟键盘,但无法使用括号或双引号(可能还有我未测试过的其他字符)发出输入事件。 我使用括号键码 0x28 和 0x29,但它根本不起作用。当我想发送一个“A”时,我
我创建了一个模拟键盘事件的小程序,用于在 Oracle 中填充数据,但是当我使用 keybd_event 引入字符下划线时,输出是错误的如果 _ 不是最后一个字符,当程序模拟下一个字符时自动添加字符
我正在尝试使用 keybd_event() 按下某些键以进入远程桌面应用程序。对于最简单的测试,我只是在远程 session 中打开记事本,并在当前用户关注记事本的情况下在本地计算机上运行调用 key
我正在尝试使用以下代码模拟回车键: keybd_event(VK_RETURN , 0, 0, 0); keybd_event(VK_RETURN , 0, KEYEVENTF_KEYUP, 0);
我正在开发一个程序,该程序需要检测用户何时按下键盘或使用鼠标,即使该程序已最小化或未获得焦点。我想我必须使用 Windows API,keybd_event (user32),但我不知道如何使用此事件
我无法让它正常工作。这应该按左键 1 秒,然后等待 10 秒,然后按右键 1 秒,依此类推: keybd_event(0x25, 0xCB, 0, 0); // press left cout #
MSDN 指出 keybd_event 已被 SendInput 取代。在重写期间,我切换到使用 SendInput...这很好除了当尝试发送 Alt 键组合时。在 Win7 64 位系统上(尚未在其
这两行代码曾经起作用(将字母 a 的键盘事件发送到当前聚焦的窗口)。我猜他们最近停止工作了,因为一些 Windows 更新了。 import win32api win32api.keybd_event
在documentation它说: KEYEVENTF_EXTENDEDKEY (0x0001):如果指定,扫描码前面有一个值为 0xE0 (224) 的前缀字节。 谁能解释一下这是什么意思? 这有什
在处理 WM_CHAR 时,是否可以在我的自定义 Win32 控件中进行检测? , 或 WM_KEYDOWN消息,击键是来自实际键盘,还是通过调用SendInput 模拟或 keybd_event类型
我希望我的程序通过 WM_KEYDOWN 发送此第三方虚拟 key VK_ALOGIN 或 0xf7。 所以我尝试以下操作: keybd_event(0xf7, 0, 0, 0); 但是接收这个键盘消
SendKeys.SendWait() 只是一个包装器,这两个代码片段是相同的吗? const int VK_ESCAPE = 0x1B; keybd_event(VK_ESCAPE, 0, 0, 0
我正在尝试使用 keybd_event 模拟 ctrl+alt+del,但它没有做任何事情,像 ctrl+esc 或 alt+tab 这样的东西可以工作,但 ctrl+alt+del 不会工作。 im
我的 friend 正在学习挪威语,我想制作一个全局热键程序来发送诸如 æ ø å 我的问题是 keybd_event 函数不允许我发送那些 key ,我似乎仅限于 virtual key codes
按'a'代码是 keybd_event(VkKeyScan(64),0,0,0); 释放关键码是 keybd_event(VkKeyScan(64),0,KEYEVENTF_KEYUP,0); 要按“
如何将所有 Unicode key 发送到“keybd_event”。 . ? 我在下面找到了'Alt + Unicode(Decimal code)'方法和C++代码 但是,我在 c# 中尝试失败了
如何模拟 Ctrl-A + Ctrl-C 使用 keybd_event? 因为我在网络浏览器表单上模拟 ctrl a + ctrl c 来复制剪贴板上的全部内容。我使用了 SendKeys.SendW
我试图阻止屏幕保护程序启动。我试过发送击键,但它们都需要按标题抓取一个窗口。如果桌面上没有打开的窗口,就没有东西可以抓取。 所以我找到了一些可能有用的东西,但我不是 C# 向导。它基于 Simulat
我正在尝试编写一个简单的全局键盘钩子(Hook)程序来重定向一些键。例如,当程序执行时,我在键盘上按下'a',程序可以禁用它并模拟'b'点击。我不需要图形用户界面,只需一个控制台就足够了(保持运行)
我的 USB 键盘上有一个 Fn 键,它允许我在键盘上启用某些功能。因此,如果我按下 Fn + F10,键盘将切换到不同的模式。 我感觉 Windows 可能无法访问我键盘上的 Fn。但是,我认为对于
我是一名优秀的程序员,十分优秀!