package me.test;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
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.DWORD;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.WPARAM;
//
public class Test05 {
static OleClientSite clientSite;
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Test Password ActiveX Control");
shell.setLayout(new FillLayout());
try {
OleFrame frame = new OleFrame(shell, SWT.NONE);
clientSite = new OleClientSite(frame, SWT.NONE,
"{488A4255-3236-44B3-8F27-FA1AECAA8844}");
clientSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
addFileMenu(frame);
} catch (SWTError e) {
System.out.println("Unable to open activeX control");
display.dispose();
return;
}
shell.setSize(400, 300);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
static void addFileMenu(final OleFrame frame) {
final Shell shell = frame.getShell();
Menu menuBar = shell.getMenuBar();
if (menuBar == null) {
menuBar = new Menu(shell, SWT.BAR);
shell.setMenuBar(menuBar);
}
MenuItem fileMenu = new MenuItem(menuBar, SWT.CASCADE);
fileMenu.setText("&Action");
Menu menuFile = new Menu(fileMenu);
fileMenu.setMenu(menuFile);
frame.setFileMenus(new MenuItem[]{fileMenu});
MenuItem menuHandle = new MenuItem(menuFile, SWT.CASCADE);
menuHandle.setText("View Activex Container's window handle");
menuHandle.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
MessageBox messageBox = new MessageBox(shell,
SWT.ICON_INFORMATION | SWT.OK);
messageBox.setText("Info");
// useful with SpyXX.exe
messageBox.setMessage("handle = ["
+ Long.toHexString(clientSite.handle).toUpperCase()
+ "]");
messageBox.open();
}
});
MenuItem menuTextData = new MenuItem(menuFile, SWT.CASCADE);
menuTextData.setText("View encrypted password");
menuTextData.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
OleAutomation ole = new OleAutomation(clientSite);
int[] rgdispid = ole.getIDsOfNames(new String[]{"TextData"});
Variant var = ole.getProperty(rgdispid[0]);
MessageBox messageBox = new MessageBox(shell,
SWT.ICON_INFORMATION | SWT.OK);
messageBox.setText("Info");
String str = null;
if (OLE.VT_NULL == var.getType()) {
str = null;
} else if (OLE.VT_EMPTY == var.getType()) {
str = "";
} else {
str = var.getString();
}
messageBox.setMessage("encrypted password = [" + str + "]");
messageBox.open();
}
});
MenuItem menuDelete = new MenuItem(menuFile, SWT.CASCADE);
menuDelete.setText("Delete last input char");
menuDelete.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Kernel32 kernel32 = Kernel32.INSTANCE;
kernel32.SetLastError(0);
User32 user32 = User32.INSTANCE;
// 找到包含密码框的java窗体的handle
HWND handle = new HWND(new Pointer(clientSite.handle));
// 找到ActiveX的handle
handle = user32.GetWindow(handle, new DWORD(User32.GW_CHILD));
// 找到ActiveX中密码输入框的handle
handle = user32.GetWindow(handle, new DWORD(User32.GW_CHILD));
// 发送消息
final WPARAM CHAR_BS = new WPARAM(0x08);
final int WM_CHAR = 0x0102;
LPARAM l = new LPARAM(0);
user32.PostMessage(handle, WM_CHAR, CHAR_BS, l);
int lastError = kernel32.GetLastError();
if (lastError != 0) {
System.out.println("last error = " + lastError);
}
}
});
MenuItem menuPostMessage = new MenuItem(menuFile, SWT.CASCADE);
menuPostMessage.setText("Append a char '1'");
menuPostMessage.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Kernel32 kernel32 = Kernel32.INSTANCE;
kernel32.SetLastError(0);
User32 user32 = User32.INSTANCE;
// 找到包含密码框的java窗体的handle
HWND handle = new HWND(new Pointer(clientSite.handle));
// 找到ActiveX的handle
handle = user32.GetWindow(handle, new DWORD(User32.GW_CHILD));
// 找到ActiveX中密码输入框的handle
handle = user32.GetWindow(handle, new DWORD(User32.GW_CHILD));
// 发送消息
final int WM_CHAR = 0x0102;
WPARAM w = new WPARAM('1');
LPARAM l = new LPARAM(0);
user32.PostMessage(handle, WM_CHAR, w, l);
int lastError = kernel32.GetLastError();
if (lastError != 0) {
System.out.println("last error = " + lastError);
}
}
});
}
}