您的位置:首页 > 编程语言 > Java开发

基于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
如有错误,欢迎指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: