1. 程式人生 > >手把手教你實現Java監聽器全域性監控

手把手教你實現Java監聽器全域性監控

http://www.csdn123.com/html/blogs/20130514/12650.htm

1.前段時間,閒來無聊,想做個像QQ截圖一樣的截圖工具,在卻在做的過程中發現java自帶API中的監聽器帶有很大的侷限性,java的滑鼠監聽器只有在滑鼠在程式視窗之上時才會生效,而鍵盤監聽器則更加侷限,只有在當前視窗為焦點視窗時才會生效,這顯然是不符合我們需要效果的,我們所需要的是全域性的鍵盤監聽,不管你在幹什麼,只要觸發我們設定的固定的組合鍵是,就會執行我們需要的功能,所以用java是不太好辦。

2.那麼QQ是怎麼做到的呢?QQ是用C語言寫的,並不是java,而且windows也是C語言寫出來的,所以他能輕易的實現這種全域性監聽。這也就是一個突破口,native,不知道你有沒有注意過這個關鍵字,這是用來呼叫原生代碼的一個關鍵字。我們可以這樣設想,假如我們將所有的程式碼全部用java實現,卻用C語言去監聽全域性鍵盤,然後返回為我們所用。是不是很有意思。

3.下面我來說明這樣用java程式碼呼叫C語言的方法(函式)。

package test;
public class HelloWorld{
         static{
                 System.loadLibrary("HelloDll");
         }  
         public static void main(String args[]){
                 HelloWorld hw = new HelloWorld();
                 hw.sayHello();
         }
         public native void sayHello();
}

上面這個System.loadLibrary("HelloDll");此句為引入一個叫做HelloDll的本地檔案,而這個必定包含了sayHello();的實現程式碼。java工作我們算是昨晚了,也就是一個簡單的列印HelloWorld的程式碼,重要的是我們怎樣用C語言去實現這個本地方法,怎樣讓其經行工作。

(1).編寫java檔案。上一步已經實現

(2).javac執行原始檔生成class檔案

(3).javah test.HelloWorld 這裡注意不用上帶字尾,我在經行這一步驟時,路徑問題很麻煩。在包這一層執行javah test.HelloWorld就會生成一個叫test_HelloWorld.h的C語言標頭檔案。

因為我們的方法是要用C語言實現的,所以經行到這一步,我們得到了一個C的標頭檔案。如果你開啟這個標頭檔案,你會發現裡面會有一個叫做JNIEXPORT void JNICALL Java_test_HelloWorld_sayHello(JNIEnv *, jobject);的方法,這個方法其實就是我們的java方法在C語言裡邊的映射了(我一般這麼稱呼,不知道對不對),我們只要將這個方法用C語言實現了,然後編譯成一個java能呼叫的DLL本地檔案就OK了。

(4)開啟Microsoft Visual C++,File-->new-->Win32 Dynamic-Link Library,新建一個叫HelloDLL的檔案動態連結工程,點選左下角FileView,點開HelloDll files。然後File-->new-->C/C++ Header File,名字為test_HelloWorld.h,然後點開Header Files裡的test_HelloWorld.h,將我們剛才生成的test_HelloWorld.h檔案內容複製進去,再File-->new-->C++ Source File,名字hello(隨便取),然後點開檔案寫入內容:

#include "test_HelloWorld.h"
#include <iostream.h>
JNIEXPORT void JNICALL Java_test_HelloWorld_sayHello
    (JNIEnv *, jobject){
		cout<<"HelloWorld"<<endl;
}

可以看出,我們生成標頭檔案的目的,無非就是為了用C語言實現,因為我們這裡引入了這個標頭檔案,而這裡邊唯一的一個方法,就是我們生成的標頭檔案,也就是我們的java程式碼未實現的程式碼在C中的對映,然後我在這個方法中列印了HelloWorld這句話。(如果看不懂C程式碼,建議百度一下,就算看不懂,憑我文字描述應該也是能懂一些的,不過應該不會看不懂吧)。

另外就是,這一個段落我寫的比較詳細,甚至比較囉嗦,主要是為了沒用過Microsoft Visual C++或者沒學過C的人,能夠手把手的教他執行這個程式,大神可以略過。

好了,言歸正傳,我們還需引入java的lib環境,Tools-->Options-->Directories在底下的方框欄中加入你C:\PROGRAM FILES\JAVA\JDK1.6.0_04\INCLUDE和C:\PROGRAMFILES\JAVA\JDK1.6.0_04\INCLUDE\WIN32也就是java的JDK的include和include中win32兩個資料夾。然後Build-->Rebuild All。

你會發現,在你C++資料夾HelloDll中Debug中有一個HelloDll.dll檔案。那麼這個檔案就是我們需要的動態連結檔案了。如果你將它開啟,那麼你會發現大部分是亂碼。

(5)將得到的HelloDll.dll複製到你的java工程的包這一層下,然後執行java test.eHelloWorld,就會列印HelloWorld這句話了,如果在沒有這個dll檔案時你就引進運行了,會丟擲一個找不到動態連結檔案的異常。

(6)這樣我們就實現了用java呼叫C語言的方法了。這就是動態連結了,在下一篇我將描述,怎樣用C語言的HHOOK鉤子去獲取windows底層鍵盤和滑鼠的相應。




相關推薦

手把手實現Java監聽器全域性監控

http://www.csdn123.com/html/blogs/20130514/12650.htm 1.前段時間,閒來無聊,想做個像QQ截圖一樣的截圖工具,在卻在做的過程中發現java自帶API中的監聽器帶有很大的侷限性,java的滑鼠監聽器只有在滑鼠在程式視窗之

手把手實現Java許可權管理系統 前端篇(十三):頁面許可權控制

許可權控制方案 既然是後臺許可權管理系統,當然少不了許可權控制啦,至於許可權控制,前端方面當然就是對頁面資源的訪問和操作控制啦。 前端資源許可權主要又分為兩個部分,即導航選單的檢視許可權和頁面增刪改操作按鈕的操作許可權。 我們的設計把頁面導航選單和頁面操作按鈕統一儲存在選單資料庫表中,選單表中包含以下許可權關

手把手實現Java許可權管理系統 後端篇(十三):系統備份還原

系統備份還原 在很多時候,我們需要系統資料進行備份還原。我們這裡就使用MySql的備份還原命令實現系統備份還原的功能。 新建工程 新建一個maven專案,並新增相關依賴,可以用Spring boot腳手架生成。 新建 kitty-bakcup 工程,這是一個獨立運行於後臺系統的應用程式,可以分開部署。 po

Java程式設計從0到1--手把手實現“HelloWorld!”

【宣告】歡迎轉載,但請保留文章原始出處→_→ Java秦學苦練博文的特點:通過“你問我答”的方式,促使你去思考一些小問題,比如:為什麼要安裝JDK?為什麼要配置環境變數?等問題。通過這種“你問我答”,帶你從不同的視角學習Java程式語言! 【正文】  Q&A(你問我答) Q:秦學苦練博主,你好!我

手把手實現一個視覺化爬蟲監控系統,酷炫的圖形化介面

1. 前言 本文並不是講解爬蟲的相關技術實現的,而是從實用性的角度,將抓取並存入 MongoDB 的資料 用 InfluxDB 進行處理,而後又通過 Grafana 將爬蟲抓取資料情況通過酷炫的圖形化介面展示出來。 在開始之前,先對 Grafana 和 InfluxDB 做一下簡要的介紹:

ChainDesk : 手把手實現簡易比特幣(Java版)

  ChainDesk : 手把手教你實現簡易比特幣(Java版) 第一章:初識比特幣與區塊鏈 http://chaindesk.cn/columninfo.html?id=26&dirId=4=20190108meiti 第二章:密碼學hash函式

手把手使用Java實現一個神經網路

首先看一下執行效果: 下面是專案整體目錄: 0.實現神經網路總覽 神經網路由層、神經元、權重、啟用函式和偏置組成。每層都有一個或者多個神經元,每一個神經元都和神經輸入/輸出連線,這些連線就是權重。 需要重點強調一下,一個神經網路可能有很多隱含層,也可能一個沒有,因為每層的神經元數目也可能不同。然而,

手把手java實現syslog訊息的收發,學不會打我嘍!

>大家好,我是道哥,專注於後端java開發,喜歡寫作和分享。如果覺得文章對你有用,那就點個讚唄!如果能轉發那是對道哥最大的支援! ## syslog的定義 >見文知義,syslog,從英文名字上可以看出是指系統日誌。 >以下內容摘自百度百科: Syslog常被稱為系統日誌或系統記錄,是一種

手把手實現一個完整的BST(超級詳細)

查找樹 str image isempty 使用 this 根據 數據 false 查找基本分類如下: 線性表的查找 順序查找 折半查找 分塊查找 樹表的查找 二叉排序樹 平衡二叉樹 B樹 B+樹 散列表的查找 今天介紹二叉排序樹。 二叉排序樹 ( Binary

手把手實現電商網站開發》課程學習總結

選擇器 AR 進行 ron 需要 float 慕課 tex github 地址:http://www.imooc.com/learn/100 這是一個純HTML/CSS的教學視頻,沒有JS。 這個視頻課程的學習我已經接近尾聲了,我大概是17年11月開始觀看學習的吧,斷斷續

WebRTC系列(1)-手把手實現一個瀏覽器拍照室Demo

1.WebRTC開發背景   由於業務需求,需要在專案中實現實時音視訊通話功能,之前基於瀏覽器開發的Web專案要進行音視訊通話,需要安裝flash外掛才能實現或者使用C/S客戶端進行通訊。隨著網際網路技術的驅動下,在很多場景下需要進行音視訊通訊,在生活中我們現在使用電話越來越少,使用微信和視訊越來越多。在一

手把手實現一個 Vue 進度條組件!

內容 分享圖片 軟件 pen export padding eight 自己 自動完成 最近在個人的項目中,想對頁面之間跳轉的過程進行優化,想到了很多文檔或 npm 等都用到的頁面跳轉進度條,於是便想自己去實現一個,特此記錄。 來看下 npm 搜索組件時候的效果: so

手把手實現一個 Vue 進度條元件!

最近在個人的專案中,想對頁面之間跳轉的過程進行優化,想到了很多文件或 npm 等都用到的頁面跳轉進度條,於是便想自己去實現一個,特此記錄。 來看下 npm 搜尋元件時候的效果: so 下面咱們一起動手實現一下唄。 定義使用方式 想實現一個元件的前提,一定要想好你的需求是什麼,還要自己去定義一

手把手實現電商網站開發

1-1 電商網站開發課程概況 1-2 電商網站開發準備工作 1-3 電商網站首頁開發之頂部結構 1-4 電商網站開發之頂部細化 1-5 電商網站開發之導航欄(上) 1-6 電商網站開發之導航欄(下) 1-7 電商網站開發之Banner部分 1-8 電商網站開發之主列表左側 1-9 電商網站首頁

手把手實現一個引導動畫

前言 最近看了一些文章,知道了實現引導動畫的基本原理,所以決定來自己親手做一個通用的引導動畫類。 我們先來看一下具體的效果:點這裡 原理 通過維護一個Modal例項,使用Modal的mask來隱藏掉頁面的其他元素。 根據使用者傳入的需要引導的元素列表,依次來展示元素。展示元素的原理:通過cloneNode來

koa2+webpack4+React+pm2純手工架子搭建,SSR專案入門教程以及流程指引詳解:手把手實現服務端首屏渲染SSR專案

本人全職喵姐,兼職程式設計師,才疏學淺,大神如果有好的idea能指點迷津的話感激不盡。以下專案為純手工搭建的Webpack4+React+KOA2+PM2前端豆腐渣工程,房子的簡陋模型,入門教程以及流程指引。後續要精裝修還是蓋茅草屋看你自己了……/微微笑(自帶表情包)……先學習…...

手把手實現一個微信自動回復機器人

xposed use 分配 oba root 閑置 oot roc 動力 RebateBot 返利機器人 項目地址 項目描述 關鍵詞: 返利 微信 阿裏媽媽 機器人 跨平臺 返利機器人,基於微信建立機器人通道與用戶通過聊天快速生成返利鏈接 利用閑置微信和極小的電腦性能開啟

手把手實現一個微信自動回覆機器人

RebateBot 返利機器人 專案地址 專案描述 關鍵詞: 返利 微信 阿里媽媽 機器人 跨平臺 返利機器人,基於微信建立機器人通道與使用者通過聊天快速生成返利連結 利用閒置微信和極小的電腦效能開啟24小時無人輪值返利機器人 購物只需要傳送連結給機器人,機器人能馬上給你回覆優惠價格及連結

手把手實現一個modal對話方塊

需求: 1、點選一個按鈕彈出對話方塊 2、對話方塊的事件能夠被父元件捕捉 3、對話方塊裡的內容能夠隨時改變 一、如何實現一個對話方塊 1.1 建立一個簡單的對話方塊     簡而言之,一個簡單的對話方塊就是一個div(也可能是幾個div),怎麼建立呢? func

android手把手實現QQ側滑選單效果

側滑選單功能非常常見,借鑑學習了之後,自己總結記錄一下,下面實現一種最簡單的側滑選單,後面再修改程式碼實現不同的側滑選單效果 首先是第一種效果 第一種效果是繼承ViewGroup,需要我們自己來測量、滑動處理等。 一、首先講解一下思路: 1、繼承GroupView重