游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3341|回复: 5

?教一下: 如何??y??被按下

[复制链接]

39

主题

138

帖子

286

积分

中级会员

Rank: 3Rank: 3

积分
286
QQ
发表于 2006-1-3 17:38:00 | 显示全部楼层 |阅读模式
?教一下: 如何??y??被按下  
用GetAsyncKeyState只能找到3??
如果要同?r找到12???被按下怎?做  
??

FOR K:=0 TO 11 DO
BEGIN
     J:=GetAsyncKeyState(PDA[K]);
     IF (J and (1 shl 15))<>0 THEN ...
END;

2

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2006-1-4 13:31:00 | 显示全部楼层

Re:?教一下: 如何??y??被按下

GetKeyBoardState,没用过??
身为MS平台下的程序员,居然不好好看MSDN,或者win32API帮助,就不要编程了!

procedure KeyBoardStateToGUI(var key: TGUIKeyBoard);
var
  i: Integer;
  keys: TKeyboardState;

  function keytoggled(vk: integer): boolean;
  begin
    Result := (keys[vk] and 1) <> 0;
  end;

  function keypressed(vk: integer): boolean;
  begin
    Result := (keys[vk] and $80) <> 0;
  end;

  function VKToShifts: TGUIShifts;
  begin
    Result := [];
    if keypressed(VK_SHIFT) or keypressed(VK_LSHIFT) or keypressed(VK_RSHIFT)
      then
      Include(Result, ssShift);
    if keypressed(VK_CONTROL) or keypressed(VK_LCONTROL) or
      keypressed(VK_RCONTROL) then
      Include(Result, ssCtrl);
    if keypressed(VK_MENU) or keypressed(VK_LMENU) or keypressed(VK_RMENU) then
      Include(Result, ssAlt);
  end;

  function VKToGUIKey(VKey: WORD): TGUIKey;
  var
    caps: boolean;
  const
    chars1: array['0'..'9'] of char = ')!@#$%^&*(';
    chars2s: array[$BA..$C0] of char = ';=,-./`';
    chars2b: array[$BA..$C0] of char = ':+<_>?~';
    chars3s: array[$DB..$DE] of char = '[\]''';
    chars3b: array[$DB..$DE] of char = '{|}"';
  begin
    //remap (caps) A,a..z,Z
    //remap other chars
    //remap special keys ? BS,DEL,ENTER,ESC,LEFT,RIGHT,UP,DOWN
    caps := ssShift in key.shifts;
    if keytoggled(VK_CAPITAL) then
      caps := not caps;
    case chr(Vkey) of
      'A'..'Z':
        begin
          Result := VKey;
          if not caps then
            Result := Result - ord('A') + ord('a');
        end;
      ' ':
        Result := Vkey;
      '0'..'9':
        begin
          Result := VKey;
          if ssShift in key.shifts then
            Result := WORD(chars1[chr(Result)]);
        end;
      chr(low(chars2s))..chr(high(chars2s)):
        begin
          Result := WORD(chars2s[vkey]);
          if ssShift in key.shifts then
            Result := WORD(chars2b[vkey]);
        end;
      chr(low(chars3s))..chr(high(chars3s)):
        begin
          Result := WORD(chars3s[vkey]);
          if ssShift in key.shifts then
            Result := WORD(chars3b[vkey]);
        end;
    else
      begin
        Result := VKey or $8000;
      end;
    end;
    AddKeyToList(key, Result);
  end;

begin
  GetKeyBoardState(keys);
  key.shifts := VKToShifts;
  for i := low(keys) to high(keys) do
  begin
    if keys <> lastkeys then
      if (keys and $80) <> 0 then
        VKToGUIKey(i);
  end;
  lastkeys := keys;
end;

请理解我的激动........

1

主题

24

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2006-1-4 18:39:00 | 显示全部楼层

Re:?教一下: 如何??y??被按下

啊,哦,好
用到再来好好看看

39

主题

138

帖子

286

积分

中级会员

Rank: 3Rank: 3

积分
286
QQ
 楼主| 发表于 2006-1-4 21:56:00 | 显示全部楼层

Re:?教一下: 如何??y??被按下

brsoft的方法果然非同泛泛
明天上班?r?y一下

39

主题

138

帖子

286

积分

中级会员

Rank: 3Rank: 3

积分
286
QQ
 楼主| 发表于 2006-1-5 15:59:00 | 显示全部楼层

Re:?教一下: 如何??y??被按下

?是不行呀
先把三???按著不放
按第四五六?上上下下?]作用

2

主题

16

帖子

22

积分

注册会员

Rank: 2

积分
22
QQ
发表于 2006-1-8 13:23:00 | 显示全部楼层

Re: Re:?教一下: 如何??y??被按下

brsoft: Re:?教一下: 如何??y??被按下  

GetKeyBoardState,没用过??
身为MS平台下的程序员,居然不好好看MSDN,或者win32API帮助,就不要...

嗯,最好用Win32API
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 04:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表