基于java的当前登录qq客户端账号检测
2018-03-07 16:08
537 查看
最近需要写一个本机qq客户端登录检测的功能,首先,在点击打开链接找到了如下C语言代码:#include <windows.h>
#include <stdio.h>
#include <string.h>
BOOL CALLBACK enumwindowsproc(HWND hwnd,LPARAM lParam){
char name[255]={0};
char rp[] = "qqexchangewnd_shortcut_prefix_";
int l = strlen(rp);
GetWindowText(hwnd,name,255);
if(strstr(name,rp)){
printf("%X\t%s\n",hwnd,name+l);
}
return 1;
}
int main(){
EnumWindows(enumwindowsproc,NULL);
}编译了一下,可以使用,看了下代码,原理是获取本地打开窗口名,获取qq号码
在java中导入jna的jar包使用JNA,完成了以上功能,实例代码如下:import java.util.HashMap;
import java.util.Map;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.win32.StdCallLibrary;
/*****
* 当前登录QQ信息检测
*
* @author wjw
*
* @since 2018-03-07
*
* @version v1.0
*
*/
public class QQLoginCheck {
/*******QQ窗口文本内容前缀****eg:qqexchangewnd_shortcut_prefix_123456(其中123456即为qq号)*****/
private static final String QQ_WINDOW_TEXT_PRE = "qqexchangewnd_shortcut_prefix_";
private static final User32 user32 = User32.INSTANCE;
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
interface WNDENUMPROC extends StdCallCallback {
boolean callback(Pointer hWnd, Pointer arg);
}
boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg);
int GetWindowTextA(Pointer hWnd, byte[] lpString, int nMaxCount);
}
/******
* 获取当前登录qq的信息
* @return map集合
*/
public static Map<String,String> getLoginQQList(){
final Map<String,String> map = new HashMap<String,String>(5);
user32.EnumWindows(new User32.WNDENUMPROC() {
public boolean callback(Pointer hWnd, Pointer userData) {
byte[] windowText = new byte[512];
user32.GetWindowTextA(hWnd, windowText, 512);
String wText = Native.toString(windowText);
if(_filterQQInfo(wText)){
map.put(hWnd.toString(), wText.substring(wText.indexOf(QQ_WINDOW_TEXT_PRE) + QQ_WINDOW_TEXT_PRE.length()));
}
return true;
}
}, null);
return map;
}
/****
* 过滤有效qq窗体信息
* @param windowText
* @return 是否为qq窗体信息
*/
private static boolean _filterQQInfo(String windowText){
if(windowText.startsWith(QQ_WINDOW_TEXT_PRE))
return true;
return false;
}
public static void main(String[] args) {
System.out.println(getLoginQQList());
}
}
运行结果类似如下:
{native@0x4008f6=12345678, native@0x20e2c=87654321}
其中map的value中保存的即为当前登录的qq号信息
end
如有错误,欢迎指正
#include <stdio.h>
#include <string.h>
BOOL CALLBACK enumwindowsproc(HWND hwnd,LPARAM lParam){
char name[255]={0};
char rp[] = "qqexchangewnd_shortcut_prefix_";
int l = strlen(rp);
GetWindowText(hwnd,name,255);
if(strstr(name,rp)){
printf("%X\t%s\n",hwnd,name+l);
}
return 1;
}
int main(){
EnumWindows(enumwindowsproc,NULL);
}编译了一下,可以使用,看了下代码,原理是获取本地打开窗口名,获取qq号码
在java中导入jna的jar包使用JNA,完成了以上功能,实例代码如下:import java.util.HashMap;
import java.util.Map;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.win32.StdCallLibrary;
/*****
* 当前登录QQ信息检测
*
* @author wjw
*
* @since 2018-03-07
*
* @version v1.0
*
*/
public class QQLoginCheck {
/*******QQ窗口文本内容前缀****eg:qqexchangewnd_shortcut_prefix_123456(其中123456即为qq号)*****/
private static final String QQ_WINDOW_TEXT_PRE = "qqexchangewnd_shortcut_prefix_";
private static final User32 user32 = User32.INSTANCE;
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
interface WNDENUMPROC extends StdCallCallback {
boolean callback(Pointer hWnd, Pointer arg);
}
boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg);
int GetWindowTextA(Pointer hWnd, byte[] lpString, int nMaxCount);
}
/******
* 获取当前登录qq的信息
* @return map集合
*/
public static Map<String,String> getLoginQQList(){
final Map<String,String> map = new HashMap<String,String>(5);
user32.EnumWindows(new User32.WNDENUMPROC() {
public boolean callback(Pointer hWnd, Pointer userData) {
byte[] windowText = new byte[512];
user32.GetWindowTextA(hWnd, windowText, 512);
String wText = Native.toString(windowText);
if(_filterQQInfo(wText)){
map.put(hWnd.toString(), wText.substring(wText.indexOf(QQ_WINDOW_TEXT_PRE) + QQ_WINDOW_TEXT_PRE.length()));
}
return true;
}
}, null);
return map;
}
/****
* 过滤有效qq窗体信息
* @param windowText
* @return 是否为qq窗体信息
*/
private static boolean _filterQQInfo(String windowText){
if(windowText.startsWith(QQ_WINDOW_TEXT_PRE))
return true;
return false;
}
public static void main(String[] args) {
System.out.println(getLoginQQList());
}
}
运行结果类似如下:
{native@0x4008f6=12345678, native@0x20e2c=87654321}
其中map的value中保存的即为当前登录的qq号信息
end
如有错误,欢迎指正
相关文章推荐
- iQQ 基于WebQQ3.0协议Java开发 跨平台QQ客户端
- 检测本机是否登录了指定QQ账号
- SharePoint基于windows验证的如何通过组策略实现IE自动以当前域账号登录SP站点
- 检测本机是否登录了指定QQ账号
- QQ、新浪微博、淘宝 账号登录网站,审核未通过,不允许二次注册
- java实现——客户端登录
- android客户端与javaweb服务端通信——登录小demo的启示
- 黑马程序员 ---------- Java 网络基础 基于UDP 模仿QQ
- wildfly8的安装-创建基于EJB3.1无状态回话bean并部署-java客户端程序调用ejb
- 构建基于CXF的WebService服务(2)-- 利用CXF提供的wsdl2java工具创建客户端
- 基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析
- 基于CAS的单点登录SSO[4]: 加入两个CAS客户端测试单点登录
- 根据当前登录域账号 获取AD用户姓名和所在OU目录
- 基于第三方QQ授权登录
- java web中实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)
- cas实现单点登录、登出(java和PHP客户端)
- 简易QQ登录实现账号密码保存
- iphone开发我的新浪微博客户端-用户登录账号添加篇(1.5)
- Android(java)学习笔记210:采用post请求提交数据到服务器(qq登录案例)
- 详解基于java的Socket聊天程序——客户端(附demo)