帮助

只看某人回复

X

关注此帖

X

对不起,您选择关注的帖子数量已到达上限,您可以对以关注的帖子进行取消操作,再进行新的帖子关注操作。

已关注的帖子

待处理的帖子

关注此帖

X

请选择关注类型

您当前的功能设置

关注帖子功能设置

请选择接收信息的方式:

短信接收帖子关注信息每月最多为50条短信(全部免费),超出部分以站内消息形式通知。

请选择接收短信通知信息时间:24小时制

为了避免短信发送对您造成打扰,请设置您方便接收短信的时间,最多可设置三个时间,通知消息将在您指定的时间以短信形式发送给您。

程序员』[C系列]游戏中设置按键的代码怎么写

访问数:1520   回复数:4
楼主作者:zokn  发表日期:2007-1-14 10:11:34
  我想编个小游戏,其中键盘设置的问题解决不了,---就是可以让玩家自行设置按键.
  哪位仁兄可以帮我解决一下吗?或者有关于这方面的代码也可以.
  谢了
1#作者:qsew123  回复日期:2007-1-14 16:31:00
  写游戏~~简单的游戏有flash~~大点游戏`用VB比较好写
2#作者:czp_opensource  回复日期:2007-1-22 22:16:00
  我自己写的给你吧: 一个DLL,通常情况下只能用DLL实现:
  总计三个文件:
  WinKeyHook.h
  :#pragma once
  #include “afx.h“
  
  class AFX_EXT_CLASS CWinKeyHook :
   public CObject
  {
  public:
   CWinKeyHook(void);
   ~CWinKeyHook(void);
   BOOL InitKeyboardHook(HWND hWnd);
   BOOL CloseKeyboardHook(void);
  };
  WarCraftKeyHookDlg.cpp:
  // WarCraftKeyHookDlg.cpp : 实现文件
  //
  
  #include “stdafx.h“
  #include “WarCraftKeyHook.h“
  #include “WarCraftKeyHookDlg.h“
  #include “WinKeyHook.h“
  #include “.\warcraftkeyhookdlg.h“
  #include <winuser.h>
  #include <winable.h>
  
  #ifdef _DEBUG
  #define new DEBUG_NEW
  #endif
  
  
  // CWarCraftKeyHookDlg 对话框
  
  
  
  CWarCraftKeyHookDlg::CWarCraftKeyHookDlg(CWnd* pParent /*=NULL*/)
   : CDialog(CWarCraftKeyHookDlg::IDD, pParent)
  {
   m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  }
  
  void CWarCraftKeyHookDlg::DoDataExchange(CDataExchange* pDX)
  {
   CDialog::DoDataExchange(pDX);
  }
  
  BEGIN_MESSAGE_MAP(CWarCraftKeyHookDlg, CDialog)
   ON_WM_PAINT()
   ON_WM_QUERYDRAGICON()
   //}}AFX_MSG_MAP
   ON_WM_CLOSE()
   ON_WM_SHOWWINDOW()
   ON_MESSAGE (WM_NOTIFYICON, OnNotifyIcon)
  END_MESSAGE_MAP()
  
  
  // CWarCraftKeyHookDlg 消息处理程序
  
  BOOL CWarCraftKeyHookDlg::OnInitDialog()
  {
   CDialog::OnInitDialog();
  
   // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
   // 执行此操作
   SetIcon(m_hIcon, TRUE); // 设置大图标
   SetIcon(m_hIcon, FALSE); // 设置小图标
  
   // 初始化托盘图标结构数据
   CString szTip = “魔兽按键修改器“; //托盘图标提示
   HICON hIcon;
  
   m_tnid.cbSize = sizeof (NOTIFYICONDATA);
   m_tnid.hWnd = this->m_hWnd;
   m_tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
   m_tnid.uCallbackMessage = WM_NOTIFYICON;
   _tcscpy (m_tnid.szTip, szTip);
   m_tnid.uID = IDR_MAINFRAME;
   hIcon = AfxGetApp ()->LoadIcon (IDI_NOTIFYICON);
   m_tnid.hIcon = hIcon;
   //显示图标
   Shell_NotifyIcon (NIM_ADD, &m_tnid);
   //释放图标资源
   ::DestroyIcon (hIcon);
  
   //装载hook对象
   m_hook.InitKeyboardHook (NULL);
  
   /*WINDOWPLACEMENT wp;
   wp.length=sizeof(WINDOWPLACEMENT);
   wp.flags=WPF_RESTORETOMAXIMIZED;
   wp.showCmd=SW_HIDE;
   SetWindowPlacement(&wp);*/
  
   return TRUE;
  }
  
  // 如果向对话框添加最小化按钮,则需要下面的代码
  // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  // 这将由框架自动完成。
  
3#作者:czp_opensource  回复日期:2007-1-22 22:17:00
  
  void CWarCraftKeyHookDlg::OnPaint()
  {
   if (IsIconic())
   {
   CPaintDC dc(this); // 用于绘制的设备上下文
  
   SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  
   // 使图标在工作矩形中居中
   int cxIcon = GetSystemMetrics(SM_CXICON);
   int cyIcon = GetSystemMetrics(SM_CYICON);
   CRect rect;
   GetClientRect(&rect);
   int x = (rect.Width() - cxIcon + 1) / 2;
   int y = (rect.Height() - cyIcon + 1) / 2;
  
   // 绘制图标
   dc.DrawIcon(x, y, m_hIcon);
   }
   else
   {
   CDialog::OnPaint();
   }
  }
  
  //当用户拖动最小化窗口时系统调用此函数取得光标显示。
  HCURSOR CWarCraftKeyHookDlg::OnQueryDragIcon()
  {
   return static_cast<HCURSOR>(m_hIcon);
  }
  
  void CWarCraftKeyHookDlg::OnClose()
  {
   // TODO: 在此添加消息处理程序代码和/或调用默认值
   //释放hook采访对象
   m_hook.CloseKeyboardHook ();
   //关闭托盘图标
   ::Shell_NotifyIcon (NIM_DELETE, &m_tnid);
  
   CDialog::OnClose();
  }
  
  BOOL CWarCraftKeyHookDlg::PreTranslateMessage(MSG* pMsg)
  {
   if (pMsg->message == WM_KEYDOWN)
   {
   //afxDump << pMsg->wParam << “\n“;
   }
   return CDialog::PreTranslateMessage(pMsg);
  }
  
  void CWarCraftKeyHookDlg::OnShowWindow(BOOL bShow, UINT nStatus)
  {
  
   CDialog::OnShowWindow(bShow, nStatus);
  }
  
  LRESULT CWarCraftKeyHookDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
  {
   if (lParam == WM_LBUTTONDBLCLK)
   {
   AfxMessageBox (“左键双击“);
   }
   if (lParam == WM_RBUTTONUP)
   {
   CMenu menu;
   menu.LoadMenu (IDR_MENU_NOTIFYICON);
   CMenu* pSubMenu = menu.GetSubMenu(0);
  
  
   CPoint pos;
   GetCursorPos(&pos);
   pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,pos.x,pos.y, this, NULL);
  
   menu.DestroyMenu();
   }
   return LRESULT();
  }
4#作者:czp_opensource  回复日期:2007-1-22 22:18:00
  
  WinKeyHook.cpp:
  // WinKeyHook.cpp : 定义 DLL 的初始化例程。
  //
  
  #include “stdafx.h“
  #include <afxdllx.h>
  #include “.\winkeyhook.h“
  #include <winuser.h>
  #include <winable.h>
  
  #ifdef _DEBUG
  #define new DEBUG_NEW
  #endif
  
  #pragma data_seg (“sharedata“)
  HWND glhPrevTarWnd = NULL;
  HWND glhDisplayWnd = NULL;
  HHOOK glhHook = NULL;
  HINSTANCE glhInstance = NULL;
  #pragma data_seg()
  
  static AFX_EXTENSION_MODULE WinKeyHookDLL = { NULL, NULL };
  
  LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
  
  extern “C“ int APIENTRY
  DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  {
   // 如果使用 lpReserved,请将此移除
   UNREFERENCED_PARAMETER(lpReserved);
  
   if (dwReason == DLL_PROCESS_ATTACH)
   {
   TRACE0(“WinKeyHook.DLL 正在初始化!\n“);
  
   // 扩展 DLL 一次性初始化
   if (!AfxInitExtensionModule(WinKeyHookDLL, hInstance))
   return 0;
  
   // 将此 DLL 插入到资源链中
   // 注意: 如果此扩展 DLL 由
   // MFC 规则 DLL(如 ActiveX 控件)隐式链接到
   // 而不是由 MFC 应用程序链接到,则需要
   // 将此行从 DllMain 中移除并将其放置在一个
   // 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
   // 规则 DLL 然后应显式
   // 调用该函数以初始化此扩展 DLL。否则,
   // CDynLinkLibrary 对象不会附加到
   // 规则 DLL 的资源链,并将导致严重的
   // 问题。
  
   new CDynLinkLibrary(WinKeyHookDLL);
   glhInstance = hInstance;
   }
   else if (dwReason == DLL_PROCESS_DETACH)
   {
   TRACE0(“WinKeyHook.DLL 正在终止!\n“);
  
   // 在调用析构函数之前终止该库
   AfxTermExtensionModule(WinKeyHookDLL);
   }
   return 1; // 确定
  }
  
  CWinKeyHook::CWinKeyHook(void)
  {
  
  }
  
  CWinKeyHook::~CWinKeyHook(void)
  {
   CloseKeyboardHook ();
  }
  
  LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
  {
   PKBDLLHOOKSTRUCT pKb = NULL;
   pKb = (PKBDLLHOOKSTRUCT)lParam;
   /*INPUT iPt;
   KEYBDINPUT kbInput;
   kbInput.wVk = VK_NUMPAD7;
   kbInput.wScan = 0;
   kbInput.dwFlags = 0;
   kbInput.dwExtraInfo = NULL;
   kbInput.time = 0;
   iPt.ki = kbInput;
   iPt.type = INPUT_KEYBOARD;*/
  
  
   if (nCode >= 0)
   {
   switch (wParam)
   {
   case WM_KEYUP:
   {
  #ifdef _DEBUG
   afxDump << pKb->vkCode << “\n“;
  #endif
   if (pKb->vkCode == VK_LWIN)
   {
   return TRUE;
   }
   if (pKb->vkCode == 192)
   {
  //#ifdef _DEBUG
  // if (SendInput (1, &iPt, sizeof (iPt)))
  // {
  // afxDump << “发送按键信息成功“ << “\n“;
  // }
  //#else
   //keybd_event (VK_NUMPAD7, 0, 0, 0);
  //#endif
   return TRUE;
   }
   return TRUE;
   }
   }
   }
   return CallNextHookEx (glhHook, nCode, wParam, lParam);
  }
  BOOL CWinKeyHook::InitKeyboardHook(HWND hWnd)
  {
   BOOL bResult = FALSE;
   if (!glhHook)
   {
   glhHook = SetWindowsHookEx (WH_KEYBOARD_LL, LowLevelKeyboardProc, glhInstance, 0);
   }
   else
   {
   return bResult;
   }
   if (glhHook != NULL)
   {
   bResult = TRUE;
   }
   glhDisplayWnd = hWnd;
   return bResult;
  }
  
  BOOL CWinKeyHook::CloseKeyboardHook(void)
  {
   BOOL bResult = FALSE;
   if (glhHook)
   {
   bResult = UnhookWindowsHookEx (glhHook);
   }
   if (bResult)
   {
   glhPrevTarWnd = NULL;
   glhDisplayWnd = NULL;
   glhHook = NULL;
   }
   return bResult;
  }