小编use*_*361的帖子

使用WH_KEYBOARD_LL和keybd_event(windows)的全局键盘钩子

我正在尝试编写一个简单的全局键盘钩子程序来重定向一些键.例如,当程序执行时,我按键盘上的'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)

c++ hook keyboard-hook keyboard-events

7
推荐指数
2
解决办法
3万
查看次数

如何在Eclipse中进入核心java类方法?

嗨,我将在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 eclipse debugging

6
推荐指数
2
解决办法
3618
查看次数

不理解JAVA中URL.openConnection()中的extends的概念

嗨,我正在尝试深入学习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中?我在哪里可以找到全面的源代码版本?

谢谢!

java eclipse extends

2
推荐指数
1
解决办法
916
查看次数

如何在Solaris中使用shell脚本将时间设置为当前时间之后的2天?

我想将系统时间修改为两天,但我发现我可以使用dateSolaris中的命令将时间设置为特定时间:

#date mmddhhmmYY
Run Code Online (Sandbox Code Playgroud)

但是不能在当前时间增加两天.有没有一种简单的方法可以使用shell命令执行此任务?如果您在linux中了解类似内容,请与我分享.

linux shell solaris

2
推荐指数
1
解决办法
138
查看次数