以下是我的代码,我的这个小游戏的操作是在屏幕上有三个随机的上下左右的键,在一定的时间内让用户输入那几个键,规定的时间内是否完成有不同的结果,我的随机出现都实现了,可就是键盘事件没有起到作用,看看我的是什么问题啊,各位,我的这个问题已经在这里问了两遍了。
 哦,忘了,那个a2,b2和c2我后来改成了静态变量,我想应该改成静态的
Public Sub Command1_Click()
Timer1 = True
Picture13.Width = 0
Dim a%, b%, c%, a2%, b2%, c2%
Dim file As String
file = App.Path
a = Int((4 - 1 + 1) * Rnd() + 1)
b = Int((4 - 1 + 1) * Rnd() + 1)
c = Int((4 - 1 + 1) * Rnd() + 1)
Select Case a
Case 1
a2 = 118Form1.Picture10 = LoadPicture(file & ("\00\lanup.bmp"))
Case 2
a2 = 114
Form1.Picture10 = LoadPicture(file & ("\00\landown.bmp"))
Case 3
a2 = 96
Form1.Picture10 = LoadPicture(file & ("\00\lanleft.bmp"))
Case 4
a2 = 100
Form1.Picture10 = LoadPicture(file & ("\00\lanright.bmp"))
End Select
Select Case b
Case 1
b2 = 118
Form1.Picture11 = LoadPicture(file & ("\00\lanup.bmp"))
Case 2
b2 = 114
Form1.Picture11 = LoadPicture(file & ("\00\landown.bmp"))
Case 3
b2 = 96
Form1.Picture11 = LoadPicture(file & ("\00\lanleft.bmp"))
Case 4
b2 = 100
Form1.Picture11 = LoadPicture(file & ("\00\lanright.bmp"))
End SelectSelect Case c
Case 1
c2 = 118
Form1.Picture12 = LoadPicture(file & ("\00\\lanup.bmp"))
Case 2
c2 = 114
Form1.Picture12 = LoadPicture(file & ("\00\landown.bmp"))
Case 3
c2 = 96
Form1.Picture12 = LoadPicture(file & ("\00\lanleft.bmp"))
Case 4
c2 = 100
Form1.Picture12 = LoadPicture(file & ("\00\lanright.bmp"))
End SelectEnd SubPrivate Sub form1_keypress(keyascill As Integer)
Dim file As String
file = App.Path
If keyascii = a2 Then
Form1.Picture10 = LoadPicture(file & ("\00\up.bmp"))
  If keyCode = b2 Then
    Form1.Picture11 = LoadPicture(file & ("\00\down.bmp"))
      If keyCode = c2 Then
        Form1.Picture11 = LoadPicture(file & ("\00\left.bmp"))
If keyCode = d2 Then
    Form1.Picture11 = LoadPicture(file & ("\00\right.bmp"))
Else
End IfElse
End IfElse
End IfElse
End If
End Sub
Private Sub Timer1_Timer()
If Picture13.Width >= 4000 ThenTimer1 = FalseEnd If
Picture13.Width = Picture13.Width + 100
End Sub

解决方案 »

  1.   

    Keypress()事件只能捕获“可打印字符”的键盘事件,如箭头键等一些特殊的铵键是不会产生这个事件的。你弄清楚你的“上、下、左、右”应该对应哪些“按键”了吗?我怎么感觉你的a2、b2、c2赋的值有点怪呢?
      

  2.   

    窗体的 KeyPreview 设成 True 了吗?
      

  3.   

    Dim a%, b%, c%, a2%, b2%, c2% 
    放到最上面通用区,否则 form1_keypress事件 调用不到
      

  4.   

    我早就试过放到通用区了,没有用!我的KETPREVIEW 是TRUE 在我在传的时候我把它给删除了,我想这个时候它没有用一楼说的好像给我的启示很打,那你的意思就是说不能用上下左右键了吗,那为什么会有它们的相应ASCII呢,那还有别 方法能解决(如果我要用上下左右键),在我改成WASD 的时候也不管用????运行的时候我只能看到运行窗口每个多长时间按键就刷新一次,但就是按键不相应,问我的那个VB任课的女老师的时候一开始她竟说出让我KETPRESS嵌套,可能吗!!!!!我们所有同学都知道她本身就是菜鸟,大半学期过去了还在讲循环,我一个星期就把它全看完了,因为它跟C语言特别像,学起来容易(只限于书本的啊!)
      

  5.   

    回复一楼的,那些A2 B2 C2 的赋值是上下左右对应的ASCII值!这种方式我还想了很长的时间,其实这只是试验版,等这个成功了,我就要加入两个组合框,到时候代码的容量估计就是现在的20倍以上,我的最高是窗口有9个随机键(模仿的劲舞团)你能看着给我一些意见吗?刚开始学的VB,有些函数还不是很会用
      

  6.   

    改用 KeyDown 事件,还有 KeyPreivew 还是要设为 True 的。
      

  7.   

    没自己看你代码,不过如果你是要捕捉上下左右的话,用这个事件:Form_KeyDown
    Form_KeyPress是捕捉不到上下左右的。
      

  8.   


      暂不谈你的 Form1_Keypress() 事件的逻辑有什么问题(说得不客气点,就是“完全是错误的!”),先说一下你的
    a2、b2、c2赋的值对应的按键:
    上----118  字符为v(只能是小写)
    下----114  字符为r(只能是小写)
    左---- 96  字符为`(Esc下面的那个键)
    右----100  字符为d(只能是小写)这样的“分布”合理吗?
      

  9.   

    是我的错,一个坏家伙告诉我的,我还给了他20分,昏!我没有及时改过来,ASCII确实错了,但那不影响大局,知道过程是怎么样就行了用过KEYDOWN,但是我要KEYCODE的值是被赋值,但用的时候格式是KEYCODE=VBKEY...,我试过将A2=VBKEYLEFT,B2=VBKEYRIGHT.........但不知道行不行
      

  10.   


    这是我修改后的,还是不行!看看把?问题这么解决呢
    Dim file As String
    Dim a%, b%, c%, a2%, b2%, c2%Public Sub Command1_Click()
    file = App.Path
    Timer1 = True
    Picture13.Width = 0Randomize
    a = Int((4 - 1 + 1) * Rnd() + 1)
    b = Int((4 - 1 + 1) * Rnd() + 1)
    c = Int((4 - 1 + 1) * Rnd() + 1)
    Select Case a
    Case 1
    a2 = vbKeyUpForm1.Picture10 = LoadPicture(file & ("\00\lanup.bmp"))
    Case 2
    a2 = vbKeyDown
    Form1.Picture10 = LoadPicture(file & ("\00\landown.bmp"))
    Case 3
    a2 = vbKeyLeft
    Form1.Picture10 = LoadPicture(file & ("\00\lanleft.bmp"))
    Case 4
    a2 = vbKeyRight
    Form1.Picture10 = LoadPicture(file & ("\00\lanright.bmp"))
    End Select
    Select Case b
    Case 1
    b2 = vbKeyUp
    Form1.Picture11 = LoadPicture(file & ("\00\lanup.bmp"))
    Case 2
    b2 = vbKeyDown
    Form1.Picture11 = LoadPicture(file & ("\00\landown.bmp"))
    Case 3
    b2 = vbKeyLeft
    Form1.Picture11 = LoadPicture(file & ("\00\lanleft.bmp"))
    Case 4
    b2 = vbKeyRight
    Form1.Picture11 = LoadPicture(file & ("\00\lanright.bmp"))
    End SelectSelect Case c
    Case 1
    c2 = vbKeyUp
    Form1.Picture12 = LoadPicture(file & ("\00\\lanup.bmp"))
    Case 2
    c2 = vbKeyDown
    Form1.Picture12 = LoadPicture(file & ("\00\landown.bmp"))
    Case 3
    c2 = vbKeyLeft
    Form1.Picture12 = LoadPicture(file & ("\00\lanleft.bmp"))
    Case 4
    c2 = vbKeyRight
    Form1.Picture12 = LoadPicture(file & ("\00\lanright.bmp"))
    End Select
    Text1.Text = Str(a2) '测试通过可以
    Text2.Text = Str(b2)
    Text3.Text = Str(c2)
    End SubPrivate Sub form1_keydown(keycode As Integer)
    file = App.Path
    If keycode = a2 Then
    Form1.Picture10 = LoadPicture(file & ("\00\up.bmp"))
      If keycode = b2 Then
        Form1.Picture11 = LoadPicture(file & ("\00\down.bmp"))
          If keycode = c2 Then
            Form1.Picture11 = LoadPicture(file & ("\00\left.bmp"))
    If keycode = d2 Then
        Form1.Picture11 = LoadPicture(file & ("\00\right.bmp"))
    Else
    End If
    Else
    End If
    Else
    End If
    Else
    End If
    End SubPrivate Sub Timer1_Timer()
    If Picture13.Width >= 4000 Then
    Timer1 = False
    End If
    Picture13.Width = Picture13.Width + 100
    End SubPrivate Sub Form_Load()
    Me.KeyPreview = True
    End Sub
      

  11.   

    我早就试过放到通用区了,没有用!我的KETPREVIEW 是TRUE 在我在传的时候我把它给删除了,我想这个时候它没有用 上面这句话是你楼主说的, 请你将那些通用区的宣告放回你原来的 Public Sub Command1_Click() 年轻人说话要给自己留一条后路.
      

  12.   


      vbKeyUp、vbKeyLeft、vbKeyRight 在VB中都是已经定义的常量,是可以用的。它们分别对应箭头键的KeyCode ,只是这个只有在 KeyDown()、KeyUp()事件中才能应用的。我不明白你的“但是我要KEYCODE的值是被赋值”是什么意思。(感觉有点不对劲 ^_^)反正你似乎得好生考虑一下你的“程序逻辑”的问题。
      

  13.   

    用KeyDown 比较合适。Form_KeyDown 的
      

  14.   

    大哥!看了我的程序你应该知道我的程序的目的吧,我还是简单的介绍下吧,在FORM上有三个随机出现的按键图标(我已经做好了),但我要的不仅仅是出现图标,还要响应键盘的KEYDOWN事件,我的想法是这个FORM的KEYDOWN事件能否作为一个过程,然后在别处被调用!就像PRIVATE SUB ABC()一样定义了个ABC过程,在别处可以调用,我没有试过,不知道可不可以,如果不可以,我可以用什么办法来实现我的目的,各位,这个问题在论坛里重复发了三次了!帮忙啊!!
      

  15.   

    你可以在程序中显式调用 KeyDown()。
      

  16.   

    用 DirectX 的 DirectInput吧。
    这个比较好抓用户按的按键。
      

  17.   

    你的意思是说可以调用KEYDOWN了,大哥,你能在给我举个调用的例子吗,我可以参照一下!谢谢了啦
      

  18.   

    新建一个工程,在Form1中添加一个文本框、一个标签控件,贴上下面这段代码:
    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
        Select Case KeyCode
            Case 37: Label1.Caption = "←"
            Case 38: Label1.Caption = "↑"
            Case 39: Label1.Caption = "→"
            Case 40: Label1.Caption = "↓"
        End Select
    End Sub
    '当Form1的 .KeyPreview 为 True 时,下面这段代码可以不要
    Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
        If (KeyCode >= 37 And KeyCode <= 40) Then
            Form_KeyDown KeyCode, 0
            KeyCode = 0     '使本控件不响应这些键
        End If
    End Sub运行程序时,你按键盘上的箭头键看效果。
      

  19.   

    你误会我的意思了,我的意思不是这样调用,是作为一个过程在别处用CALL这样的调用,不知道可不可以
      

  20.   


    我真不明白你说的究竟是什么了! -_-!--------------------------------------我的代码在 Text1 的 KeyDown() 事件中,显式调用了 Form1 的 KeyDown() 事件。这不是“在别处调用”?
    Form_KeyDown KeyCode, 0    =    Call Form_KeyDown(KeyCode, 0)
    窗体内各个对象(包括窗体)的事件代码,只能是 Private 的,也就是说,只有“本模块”中才能调用。不知道你的“在别处调用”是啥意思。如果你“在别处”要调用的代码与某个对象的事件代码相同,你应该把这段代码放到一个过程中,在对象的事件过程中调用它,“在别处”也可以调用它。
      

  21.   

    你第一行回答的就是我说的“在别处调用”,我谢谢了啦啦啦啦啦啦,其实我没有说清楚,但你理解对了,我就是想让一个KEYDOWN事件在别处被调用N次,KEYDOWN就成了一个模板(过程)把!??你有qq吗,,我想这样快点把,我会把我做的小程序发给你,你帮我看看把,我把分都给你算了
      

  22.   

    QQ一般不会对外公布。给你一个邮箱:
    [email protected]
      

  23.   

    大哥,你能找个DIRECTinPUT的例子我学学吗?我找了API里面太多的东西了,我都没有勇气在学VB了
      

  24.   

    你安装了 DirectX 3D 的SDK了吗?
    你会使用 DirectX 3D 的那些接口吗?