Java用JNA调用Windows的DLL时候出现一些问题:
DLL的主要作用是充当脚本,执行一些固定的动作:
- 通过GetWindow寻找指定的编辑框,再通过SendMessage发送WM_SETTEXT来填充文本
- 通过GetWindow寻找指定的按钮,再通过SendMessage发送WM_LBUTTONDOWN、WM_LBUTTONUP来模拟按钮点击
在VC/MFC新建一个Demo,Demo是可以正常调用DLL的,DLL也能正常工作,能达到预期效果。
//1.先获得桌面窗口
CWnd* pDesktopWnd = CWnd::GetDesktopWindow();
//2.获得一个子窗口
CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);
//3.循环取得桌面下的所有子窗口
while (pWnd != NULL)
{
HWND hWnd[20];
//保存好上一个句柄
pWndLast = pWnd;
//获得窗口类名
::GetClassName(pWnd->GetSafeHwnd(), strClassName.GetBuffer(256), 256);
//获得窗口标题
::GetWindowText(pWnd->GetSafeHwnd(), strWindowText.GetBuffer(256), 256);
if (strWindowText == L"Initial Input")
{
strTemp.Format(L"句柄是:%0.8X,类名是: %s,窗口标题是: %s", pWnd->m_hWnd, strClassName, strWindowText);
strMsg = strTemp;
AfxMessageBox(strTemp);
pWndInitialInput = pWnd;
hWnd[1] = ::GetWindow(pWndInitialInput->m_hWnd, GW_CHILD);
hWnd[2] = ::GetWindow(hWnd[1], GW_HWNDNEXT);
hWnd[3] = ::GetWindow(hWnd[2], GW_HWNDNEXT);
hWnd[4] = ::GetWindow(hWnd[3], GW_HWNDNEXT);//需要填充的控件句柄
//填充文本
::SendMessage(hWnd[4], WM_SETTEXT, 0, (LPARAM&)(str));
Sleep(200);
//路径填充完成后,模拟点击按钮
::SendMessage(hWnd[2], WM_LBUTTONDOWN, 0, 0);
Sleep(200);
::SendMessage(hWnd[2], WM_LBUTTONUP, 0, 0);
Sleep(200);
break;
}
}
主要问题出现在Java的Demo通过JNA调用DLL的时候,就无法正常SendMessage。Java的Demo调用DLL是成功了的,AfxMessageBox是正常弹框了,就SendMessage没有效果:
public class AUTO {
public interface IAUTO extends Library {
//实例化DLL
IAUTO hDLL= Native.load("Auto.dll",IAUTO.class);
//声明DLL导出函数
boolean GetAuto();
}
}
原因是什么呢?