我正在尝试编写一个简单的全局键盘钩子程序来重定向一些键.例如,当程序执行时,我按键盘上的'a',程序可以禁用它并模拟'b'点击.我不需要图形ui,只需一个控制台即可(保持运行)
我的计划是使用全局钩子来捕获键输入,然后使用keybd_event来模拟键盘.但我有一些问题.
第一个问题是程序可以正确地阻止'A'但是如果我在键盘上点击'A'一次,回调函数中的printf和keybd_event一起被执行两次.所以,如果我打开一个txt文件,我点击'A'一次,有两个'B'输入.这是为什么?
第二个问题是为什么使用WH_KEYBOARD_LL的钩子可以在没有dll的情况下在其他进程上工作?在我写这个例子之前,我认为我们必须使用dll来创建一个全局钩子...
#include "stdafx.h"
#include <Windows.h>
#define _WIN32_WINNT 0x050
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL fEatKeystroke = FALSE;
if (nCode == HC_ACTION)
{
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (fEatKeystroke = (p->vkCode == 0x41)) { //redirect a to b
printf("Hello a\n");
keybd_event('B', 0, 0, 0);
keybd_event('B', 0, KEYEVENTF_KEYUP, 0);
break;
}
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}
int …Run Code Online (Sandbox Code Playgroud) 嗨,我将在Java中挖掘更多,所以我想看看程序是如何在核心类中执行的.例如,我想知道如何String.chatAt()实现,所以我设置断点并试图进入调试模式.但是我失败了,当程序命中时,我在第二行设置了bp,我用它进入它仍然继续到第三行.
String a = "1231231241241";
char b = a.charAt(0);
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)
我认为它应该进入源代码并显示"找不到源代码",然后给我一个附加源文件的机会,对吧?但为什么它不能进入呢?我只能使用ctrl+right点击方法进入源和附加.
嗨,我正在尝试深入学习JAVA,所以我在以下几行中深入研究JDK源代码:
URL url = new URL("http://www.google.com");
URLConnection tmpConn = url.openConnection();
Run Code Online (Sandbox Code Playgroud)
我附加了源代码并在第二行设置断点并进入代码.我可以看到代码流是:URL.openConnection() - > sun.net.www.protocol.http.Handler.openConnection()我对此有两个问题
首先在URL.openConnection()中,代码是:
public URLConnection openConnection() throws java.io.IOException {
return handler.openConnection(this);
}
Run Code Online (Sandbox Code Playgroud)
handler是URLStreamHandler的一个对象,定义为blow
transient URLStreamHandler handler;
Run Code Online (Sandbox Code Playgroud)
但是URLStreamHandler是一个抽象类,方法openConnection()没有在其中实现,所以当handler调用这个方法时,它应该去找一个实现这个方法的子类,对吧?但是有很多类在sun.net.www.protocol中实现这些方法(如http.Hanlder,ftp.Handler)代码应该如何知道它应该调用哪个"openConnection"方法?在这个例子中,这个handler.openConnection()将进入http.Handler并且它是正确的.(如果我将网址设置为ftp://www.google.com,则会进入ftp.Handler)我无法理解该机制.
第二.我已经附加了源代码,所以我可以进入JDK并查看变量,但对于许多类,如sun.net.www.protocol.http.Handler,src.zip中没有源代码.我用谷歌搜索了这个类,我可以在线获取源代码,但为什么他们没有把它(以及许多其他类)放在src.zip中?我在哪里可以找到全面的源代码版本?
谢谢!
我想将系统时间修改为两天,但我发现我可以使用dateSolaris中的命令将时间设置为特定时间:
#date mmddhhmmYY
Run Code Online (Sandbox Code Playgroud)
但是不能在当前时间增加两天.有没有一种简单的方法可以使用shell命令执行此任务?如果您在linux中了解类似内容,请与我分享.