简陋飞信、QQ轰炸器--Java

来源:互联网 发布:非结构化数据如何分析 编辑:程序博客网 时间:2024/04/29 07:30

  放假在家不务正业,偶然想到白大嘴以前用C#实现过的QQ 飞信轰炸软件,就想用Java也搞一个。

  用java的亲们都知道,JNI蛋疼无比,虽然楼主没有用过,但仍不敢尝试。于是google到JNA这个高级货色,可以用纯java来写。但事实证明,JNA更蛋疼,楼主要是用JNI的话最多再写2个C代码,JNA的文档奇烂无比,API基本都没有解释。JNA封装了use32.dll中部分函数,但最简单的获得当前鼠标坐标的函数却没有找到。另一种方法是自己继承Library接口即可调用函数,非常简单。但C和Java的数据结构不同,虽然JNA定义了转换规则,仍然很头晕。

  user32.dll中PostMessage和SendMessage可以向指定窗口发送消息。PostMessage是非阻塞的,而SendMessage是阻塞的。SendMessage有SendMessageA和SendMessageM 2种(楼主只用了这两个,可能还有其他),SendMessageA仅发送ASCII字符,而SendMessageM用来发送Unicode。

  Windows API 各函数的参数还是一头雾水,以后重新搞C的时候再看吧。

  楼主代码写得很烂,只是想实现功能,就无所谓了。

import java.awt.event.KeyEvent;import java.io.UnsupportedEncodingException;import java.nio.charset.Charset;import com.sun.jna.Native;import com.sun.jna.Pointer;import com.sun.jna.platform.win32.Kernel32;import com.sun.jna.platform.win32.User32;import com.sun.jna.platform.win32.WinDef.HMODULE;import com.sun.jna.platform.win32.WinDef.LRESULT;import com.sun.jna.platform.win32.WinUser;import com.sun.jna.platform.win32.WinUser.HHOOK;import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;import com.sun.jna.platform.win32.WinUser.MSG;import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;import com.sun.jna.platform.win32.WinDef.WPARAM;import com.sun.jna.win32.StdCallLibrary;/** * Hello world! * */public class App {public interface USER32 extends StdCallLibrary{USER32 INSTANCE = (USER32) Native.loadLibrary("user32", USER32.class);int GetWindowTextA(Pointer hwnd, byte[] lpString, int nMaxCount);Pointer GetWindowDC(Pointer hwnd);Pointer WindowFromPoint(int xPoint, int yPoint);boolean GetCursorPos(int[] coor);int SendMessageW(Pointer hwnd, int wMsg, int wParam, String lParam);int SendMessageW(Pointer hwnd, int wMsg, int wParam, int lParam);void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);static final int WM_CHAR = 0x102;}        public static void main( String[] args ) throws UnsupportedEncodingException    {    int[] pointer = new int[2];        String text = "中午好";    int i = 10;    try {Thread.sleep(2000);} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}    while(i-->0){    USER32.INSTANCE.GetCursorPos(pointer);//获取当前鼠标位置        Pointer window = USER32.INSTANCE.WindowFromPoint(pointer[0], pointer[1]);  //获得鼠标所在的窗口    for(int j=0;j<text.length();j++){        USER32.INSTANCE.SendMessageW(window, WinUser.WM_CHAR, text.codePointAt(j), null);//发送消息    }    byte enter = 13 & 0xff;    USER32.INSTANCE.SendMessageW(window, WinUser.WM_KEYDOWN, enter, 0);//发送回车键    try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}    }    }    }

  楼主的代码很短,4行就可以把功能做出来了,但楼主对以上代码充满着困惑:

1.自定义的USER32接口中的各种类型,是楼主参考网上实现的。与JNA实现的几个函数中类型不同。但仍然能跑,楼主很奇怪。

2.楼主对SendMessage中的参数很不理解。

3.QQ和微博发送消息是Cntrl+Enter,SendMessage不能实现,楼主想用SendInput来着,但是没找到WinUser.INPUT.TYPE对应的常量,对JNA怨念不已....求解决方案。


  希望有热心者给楼主留言解答。

原创粉丝点击