最近需要写一个本机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
如有错误,欢迎指正