|
1
11
有一个复杂的问题,因为你试图发送字符串。目标窗口是否启用Unicode有什么关系。SendMessage有两个版本,SendMessageA()和SendMessageW()。如果程序有日期并且使用8位字符串而不是UTF-16编码字符串,则需要使用前者。 你可以使用Spy++来发现。使用finder工具选择应用程序的窗口。在常规属性选项卡中,您将看到“windowproc”。如果窗口已启用Unicode,则会显示(Unicode)。如果你看不到它,那么字符串必须被翻译成8位字符。 要生成需要传递的字符串指针,可以使用Marshal.StringToHGlobalAnsi或StringToHGlobalUni(分别为8位和Unicode)。但是,您可以玩一个技巧,让P/Invoke marshaller为您翻译字符串。省去了通话后释放字符串的麻烦。对于Ansi版本,可以这样声明API函数:
Unicode版本如下:
最后一点注意:如果该窗口属于另一个应用程序,则无法正常工作,您将使其崩溃。您传递的指针值仅在您自己的进程中有效,而不是在C++进程中有效。要解决这个问题,必须在目标进程中分配内存,以便指针有效。这需要OpenProcess获取进程的句柄,VirtualAllocEx()在目标进程中分配内存,足够大以存储字符串,WriteProcessMemory写入字符串。现在可以调用SendMessage(),使用用IntPtr声明的wParam和lParam参数的版本,传递从VirtualAllocEx获得的值。接下来使用VirtualFreeEx()释放内存,并使用CloseHandle进行清理。如果你经常这样做的话,也可以把记忆留到下次。 很多人在那里犯了错误。更不用说安全问题,WriteProcessMemory需要管理员权限,需要UAC提升。 |
|
|
2
0
通过 字符串的任何部分都会涉及不安全的代码, |
|
|
3
-2
我们最终用“WmCpyDta\u d.dll”来处理所有这些。 |
|
|
Justinas DaukÅ¡a · C++超长整数计数器 8 年前 |
|
|
mtnp · 在javafx中创建长时间单击或按下按钮的方法 8 年前 |
|
|
NGM · 使用ajax更新元素直到for循环结束才生效 8 年前 |
|
|
Josef Kvita · 在Python中获取C#Int64 8 年前 |
|
|
user4288514 · 大数与长整数之间的除法:如何绕过浮点转换? 8 年前 |
|
|
Oliver Nikolovski · 检查计算结果是整数还是小数 8 年前 |