我正在尝试使用 Java 中的 uint 参数调用 SendMessage,但我无法将 int 转换为 uint。我无法更改 SendMessage 中的 uint 参数,因为它是一个 windows 函数。有没有办法做到这一点?
背景:我实际上正在使用处理,我正在按照以下教程访问 user32.dll: http://processing.org/hacks/hacks: jnative
和http://jnative.free.fr/SPIP-v1-8-3/article.php3?id_article=8
我正在关注这个来调用 SendMessage http://www.codeproject.com/KB/cs/Monitor_management_guide.aspx
这是我的代码,GetActiveWindow 工作正常,它来自上面的第二个链接。
int SC_MONITORPOWER = 0xF170;
int WM_SYSCOMMAND = 0x0112;
int MONITOR_ON = -1;
int MONITOR_OFF = 2;
int MONITOR_STANDBY = 1;
HWND ValidHWND = org.xvolks.jnative.util.User32.GetActiveWindow();
org.xvolks.jnative.util.User32.SendMessage(ValidHWND, (UINT)WM_SYSCOMMAND,
(WPARAM)SC_MONITORPOWER, (LPARAM)MONITOR_STANDBY);
最后一行是发生错误的地方,它表示 User32 类型的预期 UINT 不适用于我提供的 LONG。我也不能修改 SendMessage
这是上面调用调用的相应 java 文件,GetActiveWindow 部分工作正常,因为它来自教程。我正在尝试定制 Sendmessage 以遵循它,但我还没有完全弄清楚。但是,我认为这对我得到的错误并不重要,因为在这里将参数更改为 SendMessage 不会改变编译器的期望。我已经尝试将 int Msg 更改为 uint Msg 到 long Msg,编译器仍然需要上面代码中的 uint。
public class Paul_s_User32 extends User32 {
public HANDLE GetActiveWindow() {
JNative GetActiveWindow = new JNative(DLL_NAME, "GetActiveWindow");
GetActiveWindow.setRetVal(Type.INT);
GetActiveWindow.invoke();
HWND handle = new HWND(GetActiveWindow.getRetValAsInt());
GetActiveWindow.dispose();
return handle;
}
public IntPtr SendMessage(IntPtr hWnd, int Msg,
IntPtr wParam, IntPtr lParam) {
JNative SendMessage = new JNative(DLL_NAME, "SendMessage");
//SendMessage.setRetVal(Type.long);
SendMessage.invoke();
SendMessage(ValidHWND, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_STANDBY);
}