当前位置: 首页 > 知识库问答 >
问题:

JNA调用PostMessage~传递字符串“环境”

傅兴平
2023-03-14

http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c10849/Setting-a-System-Environment-Variable.htm

发送消息(HWND\u广播,WM\u设置更改,0,(LPARAM)“环境”);

JNA和windows xp:调用以通知环境已更改

见链接:twall.github.com/jna/3.5.1/javadoc/

请参阅链接:twall。github。com/jna/3.5.1/javadoc/com/sun/jna/platform/win32/User32。html

PostMessage(WinDef.HWND HWND,int msg,WinDef.WPARAM WPARAM,WinDef.LPARAM LPARAM)

此函数将消息放置在与创建指定窗口的线程相关联的消息队列中,然后返回,而无需等待线程处理消息。

import com.sun.jna.*;
import com.sun.jna.win32.*;
import com.sun.jna.platform.win32.*;
import com.sun.jna.ptr.*;

public class MainJNA {

public static void main (String [] args){

String  myString = "Environment";
Pointer myPointer = new Memory(myString.length()+1);
    myPointer.setString(0,myString);

Pointer HWND_BROADCAST = new Pointer(0xFFFF);

int           msg    = 0x001A; // WM_SETTINGCHANGE = WM_WININICHANGE = 0x001A
WinDef.HWND   hWnd   = new WinDef.HWND( HWND_BROADCAST );
WinDef.WPARAM wParam = new WinDef.WPARAM(0);
WinDef.LPARAM lParam = new WinDef.LPARAM( myPointer.getLong(0) );
// Exception in thread "main" java.lang.IllegalArgumentException:
// Argument value 0x6d6e6f7269766e45 exceeds native capacity (4 bytes)
// mask=0xffffffff00000000

User32 user32 = (User32) Native.loadLibrary(
"user32" , User32.class , W32APIOptions.DEFAULT_OPTIONS );
user32.PostMessage( hWnd , msg , wParam , lParam );

}

} // end of class MainJNA

如何将字符串参数“Environment”传递给user32。邮件后???

在线程“main”java中不会出现异常。lang.IllegalArgumentException:参数值0x6d6e6f7269766e45超过本机容量(4字节)掩码=0xffffff00000000

谢谢

共有1个答案

陶博涉
2023-03-14

出现该错误是因为您试图将64位值(myPointer.getLong(0))写入32位容器(LPARAM)。

在我的指针中,已经有了LPARAM所需的指针值;建议将指针“强制转换”到LPARAM的方法是简单地声明一个版本的PostMessage,该版本采用适当类型的第四个参数,例如。

void PostMessage(WinDef.HWND hWnd, int msg, WinDef.WPARAM wParam, Pointer lParam);
void PostMessage(WinDef.HWND hWnd, int msg, WinDef.WPARAM wParam, String lParam);

这比在不同类型之间手动转换(即从字符串或指针转换为整数类型)更可取,也更安全

 类似资料:
  • 我试图通过C#代码传递此字符串,但失败了: soap:body1479374 System.xml.XmlDocument文档=新建System.xml.XmlDocument();Doc.LoadXML(字符串); 尝试发送作为整体和作为3个部分,但在A节内失败 string Sectiona=@“ soap:body ”; 字符串段B=“1479374”; 字符串节C=“”; 字符串数据=段A

  • 我在postman中有2个chanined请求,第一个执行GET以列出所有数据,然后根据返回的值设置环境变量。第二个请求尝试使用环境变量作为字段值的 POST。 请求1 的值为5 请求 2 带主体: 这可以通过Postman的GUI正常工作,但是当从命令行Newman运行时,当请求到达API时,的值是不是如预期的那样。 我执行了相同类型的替换,环境变量直接从返回的数据中设置 这部作品不是《邮递员》

  • 问题内容: 我正在从Java程序的Delphi编译的* .so文件中调用函数。经过研究后,JNA似乎是他的路要走。在深入研究一些复杂的Delphi代码之前,我尝试使用一些“ Hello World”代码,但是在获取由Delphi函数返回的字符串时遇到了麻烦。 Delphi代码(helloworld.pp): 我从命令行使用“ fpc -Mdelphi helloworld.pp ” 编译它,生成

  • 问题内容: 我正在尝试在环境中传递JSON字符串。 test_host_1是172.31.00.00 test_host_2是172.31.00.00 但是在春季日志中,我在打印的地方得到了JSON解析异常 如图所示,双引号转换为单引号!!! 我尝试转义双引号,但没有运气。 知道为什么会发生,还是可以解决? 问题答案: 关于Ansible模板引擎的事情。 如果字符串看起来像对象(以或开头),则An

  • 问题内容: 我正在尝试通过使用JSON格式的字符串初始化Javascript变量来加载数据表。如果我声明: 那么我的表将正确加载该行。 我尝试在脚本之前初始化Java字符串,然后将该对象传递给Javascript变量,如下所示: 我的表无法识别这一点,并且在尝试以这种方式传递行时无法加载该行。如何正确地将Java字符串传递给Javascript,以便我的表能够加载数据? 问题答案: 尝试使用引号。

  • 问题内容: 我习惯在中执行以下操作: 输出为: 但是,在Java中,这似乎不起作用。我认为是因为该对象是复制的,而不是通过referenced传递的。我以为字符串是对象,总是通过引用传递。 这里发生了什么? 问题答案: 你有三种选择: 使用StringBuilder: 创建一个容器类,并将容器的实例传递给你的方法: 创建一个数组: 从性能的角度来看,StringBuilder通常是最佳选择。