很简单的问题,硬是让我弄复杂了,各位请进!

zj_zwl 2014-01-09 05:11:43
我要把键盘击键转换成字符,用到系统API:ToUnicode
代码简化如下:



Private Declare Function ToUnicode Lib "user32.dll" (ByVal wVirtKey As Int32, ByVal wScanCode As Int32,
ByRef lpKeyState As Byte, ByVal pwszBuff As StringBuilder,
ByVal cchBuff As Int32, ByVal wFlags As Int32) As Int32

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim b As New StringBuilder(" ", 1)
ToUnicode(191, 0, 0, b, 1, 0)'191是字符"/"
Debug.Print(b.ToString)
Dim t As String = ""'如果没有这句,则上面的代码是正确的,否则变量b的值将为空!
End Sub




我真心不懂了,各位怎么看?
...全文
128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zj_zwl 2014-01-10
  • 打赏
  • 举报
回复
引用 6 楼 wyd1520 的回复:
[quote=引用 5 楼 zj_zwl 的回复:] 解决了 把ToUnicode函数申明第三个参数改成字节数组就可以了. 问题是解决了,可深层次的原因不明!
你这么一说 ToUnicode(191, 0, 0, b, 1, 0)'191是字符"/" 我明白了 第三个参数是 ref 等于传指针进去。 而你直接传的是 常量。而ToUnicode 会去修改那个ref 的值的 所以异常了,而这个异常又不抛出来。。[/quote] 不是你说的这个原因,ToUnicode(191, 0, 0, b, 1, 0)'191是字符"/" 如果仅这条语句是可以正确获取值的. 这么说吧:

Dim b As New StringBuilder(" ", 1)
ToUnicode(191, 0, 0, b, 1, 0)'191是字符"/"
'如果你的方法体内只有这2句,是可以正确获取值的

Dim b As New StringBuilder(" ", 1)
dim t as string=""
ToUnicode(191, 0, 0, b, 1, 0)'191是字符"/"
'这样就不能正确获取值,请注意看,这个方法体内只是多一个变量!
本拉灯 2014-01-09
  • 打赏
  • 举报
回复
引用 5 楼 zj_zwl 的回复:
解决了 把ToUnicode函数申明第三个参数改成字节数组就可以了. 问题是解决了,可深层次的原因不明!
你这么一说 ToUnicode(191, 0, 0, b, 1, 0)'191是字符"/" 我明白了 第三个参数是 ref 等于传指针进去。 而你直接传的是 常量。而ToUnicode 会去修改那个ref 的值的 所以异常了,而这个异常又不抛出来。。
zj_zwl 2014-01-09
  • 打赏
  • 举报
回复
解决了 把ToUnicode函数申明第三个参数改成字节数组就可以了. 问题是解决了,可深层次的原因不明!
zj_zwl 2014-01-09
  • 打赏
  • 举报
回复
引用 3 楼 wyd1520 的回复:
[quote=引用 2 楼 zj_zwl 的回复:] [quote=引用 1 楼 KarasCanvas 的回复:] 写一个从keycode到字符的映射就好了,何必这么麻烦...
就算你说的方法更好,我也想知道上面这种情况怎么解决.[/quote] [DllImport("user32.dll")] private extern static int ToUnicode(int wVirtKey, int wScanCode, ref byte lpKeyState, StringBuilder pwszBuff, int cchBuff, int wFlags); StringBuilder sb=new StringBuilder(); byte by = 0; ToUnicode(191, 0,ref by, sb, 1, 0);//'191是字符"/" 这个在C#里没问题的 你把那个stringBuider的构造重改成无参的试试 [/quote] 试过了,在c#的确可以,但在vb.net中就是不行.
本拉灯 2014-01-09
  • 打赏
  • 举报
回复
引用 2 楼 zj_zwl 的回复:
[quote=引用 1 楼 KarasCanvas 的回复:] 写一个从keycode到字符的映射就好了,何必这么麻烦...
就算你说的方法更好,我也想知道上面这种情况怎么解决.[/quote] [DllImport("user32.dll")] private extern static int ToUnicode(int wVirtKey, int wScanCode, ref byte lpKeyState, StringBuilder pwszBuff, int cchBuff, int wFlags); StringBuilder sb=new StringBuilder(); byte by = 0; ToUnicode(191, 0,ref by, sb, 1, 0);//'191是字符"/" 这个在C#里没问题的 你把那个stringBuider的构造重改成无参的试试
zj_zwl 2014-01-09
  • 打赏
  • 举报
回复
引用 1 楼 KarasCanvas 的回复:
写一个从keycode到字符的映射就好了,何必这么麻烦...
就算你说的方法更好,我也想知道上面这种情况怎么解决.
种草德鲁伊 2014-01-09
  • 打赏
  • 举报
回复
写一个从keycode到字符的映射就好了,何必这么麻烦...

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧