我正在使用Raw Input API从键盘(实际上是模拟键盘的磁条卡读卡器)获取按键的集合.这里有几个代码摘录,所以你可以知道我是如何获得密钥的.
[StructLayout(LayoutKind.Sequential)]
internal struct RAWKEYBOARD
{
[MarshalAs(UnmanagedType.U2)]
public ushort MakeCode;
[MarshalAs(UnmanagedType.U2)]
public ushort Flags;
[MarshalAs(UnmanagedType.U2)]
public ushort Reserved;
[MarshalAs(UnmanagedType.U2)]
public ushort VKey;
[MarshalAs(UnmanagedType.U4)]
public uint Message;
[MarshalAs(UnmanagedType.U4)]
public uint ExtraInformation;
}
[StructLayout(LayoutKind.Explicit)]
internal struct RAWINPUT
{
[FieldOffset(0)]
public RAWINPUTHEADER header;
[FieldOffset(16)]
public RAWMOUSE mouse;
[FieldOffset(16)]
public RAWKEYBOARD keyboard;
[FieldOffset(16)]
public RAWHID hid;
}
Queue<char> MyKeys = new Queue<char>();
// buffer has the result of a GetRawInputData() call
RAWINPUT raw = (RAWINPUT)Marshal.PtrToStructure(buffer, typeof(RAWINPUT));
MyKeys.Enqueue((char)raw.keyboard.VKey);
Run Code Online (Sandbox Code Playgroud)
运行代码时,读卡器输出字符串%B40^TEST,但在MyKeys集合中,我有以下值:
{ 16 …Run Code Online (Sandbox Code Playgroud) 我目前使用 RawInput 来获取鼠标输入,但它似乎没有检测到超过 3 个按钮。它说它也支持 X1 和 X2,但我的鼠标似乎都没有触发它们。我环顾四周,但在谷歌上没有找到任何关于如何使用所有其他鼠标按钮的信息。如果可能的话,我想找到一些东西,比如 RawInput,可以区分多个鼠标。看来我必须将 rawinput 与 HID 设置一起使用,但我不知道是否有一个标准的多鼠标按钮 HID 我可以读取或任何东西
我有一个仅消息窗口(ATL :: CWindowImpl),它使用RIDEV_INPUTSINK标志为原始输入注册自己,这意味着无论窗口是否是前台窗口,它都会获得所有输入.当只有一个窗口的实例时,这很有效.
但是,当我创建多个窗口实例时,只有一个接收WM_INPUT消息(我当前正在创建两个消息,并且只有第二个要创建消息).
在创建两个窗口期间,RegisterRawInputDevices(使用RIDEV_INPUTSINK | RIDEV_NOLEGACY)正在成功.此外,没有接收原始输入的窗口仍在接收其他消息,因此窗口本身不存在问题......
如果它是相关的,我正在使用VC11测试版,并创建窗口并在不同的线程上调度消息(使用std :: thread).
这是API限制(即每个进程只限一个输入接收器)吗?或者有没有办法让这个工作?
提前致谢.
编辑:
现在我当前的解决方法是只有一个窗口,并将输入消息传递给其他窗口,但这是一个烂摊子,并且在我希望它工作的情况下不能工作(我有我的地方) app加载可能需要原始输入的插件,我不希望他们必须注册我的应用程序,除非我真的必须这样做...).
目前,我正在制作一个拦截特定键盘击键的程序(使用其HID进行过滤).因此,为了知道特定设备发送了哪些击键,我使用了RawInput技术,受到这个伟大教程的启发:
http://www.codeproject.com/Articles/17123/Using-Raw-Input-from-C-to-handle-multiple-keyboard
现在,它工作得很好:我可以获得击键并知道哪个键盘生成了它.
我的项目的难点在于拦截和阻止来自这个特定键盘的击键,以避免这些击键到达聚焦应用程序(聚焦意味着操作系统带来的前景窗口).
因此,在具有窗口句柄的所有当前线程上,自然解决方案是低级全局钩子.
我使用并调整了此页面中的代码来执行此操作:
http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx
我在visual studio中创建了一个新项目,以避免在我的工作中乱七八糟.经过一些研究,我能够通过在回调函数中返回值(-1)来阻止所有应用程序的击键:
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
//Check if we have a key to pass
if (
nCode >= 0 && (
(wParam == (IntPtr)WM_KEYDOWN) || (wParam == (IntPtr)WM_KEYUP) )
)
{
int vkCode = Marshal.ReadInt32(lParam);
if ((Keys)vkCode == Form1.KeysToIgnore)
{
return (IntPtr)(-1);
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
为了将所有内容(钩子程序和击键检测)放在一起,我在最终项目中创建了两个线程:
1st:使用RawInput识别每个键击并将其附加到设备
第二:用于挂钩所有窗口并阻止某些击键
线程1被设计为发送键击以阻止线程2,线程2读取发送到所有窗口应用程序的所有消息和来自特定键盘的垃圾键击.我确切地知道这两个线程是同步的.
问题是钩子似乎是在执行Rawinput之前执行的,所以我无法识别发送击键的键盘.我不知道怎么做,也许改变钩子的类型(避免使用低级键盘钩,但使用用户空间级键盘钩).
或者也许有人知道一种聪明的方式来做我想做的事情?
我知道这个请求真的很复杂,请不要犹豫,询问更多细节.
我正在使用Raw Input API,因为我需要能够以不同方式响应来自不同USB HID设备的密钥,即使它是相同的密钥.
我的窗口WM_INPUT正确收到消息.我可以检索RAWKEYBOARD结构以获取我需要的所有信息.
现在我想阻止那些USB设备切换NumLock.我希望Raw Input API可能允许我吞下NumLock按键?
我已经尝试将WM_INPUT消息的结果设置为1,但这似乎没有效果.
(我在C#中写这个,但由于这是所有低级Windows API,你可能不需要知道C#或.NET来回答这个问题.)
编辑:哦是的,我也尝试使用全局键盘钩(SetWindowsHookEx)来吞下NumLock按键.不幸的是,只要我初始化Raw Input API,就会在窗口处于活动状态时不再调用全局键盘钩子.我也尝试在Raw Input 之后设置全局钩子,但效果相同.
我希望能够从用户(通过raw_input()或模块)获得输入,并且能够自动输入可以添加,删除或修改的文本.我在javascript中知道当你使用提示时,你可以这样做
var = prompt("Enter your name: ","put name here")
Run Code Online (Sandbox Code Playgroud)
它将显示为:
Enter your name:
put name here
Run Code Online (Sandbox Code Playgroud)
这里'put name here'是在文本框中,并可以修改.我希望在shell环境(我使用unix)而不是窗口中实现它.
有什么办法吗?
哦,告诉我是否需要澄清我希望的更多内容.
我不认为你们明白我想做什么.
我基本上想要在输入中包含提示,但让用户能够退出提示/编辑它,如果他们想要的话.
该脚本可能用于简单的基于shell的单行文本编辑器和制表符完成类型的东西.
我正在编写一个Python脚本来解析来自QR阅读器(系统被视为键盘)的输入.
目前我正在使用,raw_input()但此功能等待EOF /行尾符号,以便将收到的字符串提交给程序.我想知道是否有一种方法可以连续解析输入字符串,而不仅仅是在行末端限制的块中.
在实践中: - 在python中是否有一种方法可以异步并连续地解析控制台输入?- 有没有办法改变raw_input()(或等效函数)寻找另一个字符,以便将字符串读取提交到程序中?
通常,当raw_input要求您输入内容并按 Return 时,反馈会打印在新行上。如何打印提示行?在这种情况下,CR 可以工作吗?
演示:
prompt = "Question: "
answer = raw_input(prompt)
print answer
print("Correct!")
Run Code Online (Sandbox Code Playgroud)
键入答案并按 Return 后的模拟输出:
>> Question: my answer
>> Correct!
Run Code Online (Sandbox Code Playgroud)
期望的输出:
>> Correct!
Run Code Online (Sandbox Code Playgroud) R 中的函数readline与 python 中的函数类似raw_input,都允许传递交互式参数。
但是,当我在终端中运行 R 脚本时,它不起作用。
这是一个例子txt.R:
#!/usr/bin/env Rscript
x = readline('Hello?')
print(x)
Run Code Online (Sandbox Code Playgroud)
在终端中运行./txt.R,只打印出:
Hello?
[1] ""
不等待我的输入。那么如何解决呢?
我有以下Node.js代码行为奇怪:
#!/usr/bin/env node
"use strict";
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function input(prompt) {
rl.question(prompt, function (x) {
rl.close();
console.log("debug: " + x);
return x;
});
}
function main() {
var n = input("Number: ");
// console.log("value: " + n); // problematic line
}
main();
Run Code Online (Sandbox Code Playgroud)
我想模仿Python raw_input,即从用户那里读取一行.显示提示后,应阻止程序,直到用户按Enter键.
如果"有问题的行"在注释中,它可以工作,程序正在等待输入.但是,如果此行不在注释中,则程序不会等待输入并n变为undefined.为什么?如何编写一个返回用户输入的函数?