Winapi Win32文本框控件alt keypress消息

Winapi Win32文本框控件alt keypress消息,winapi,unicode,keyboard,editbox,Winapi,Unicode,Keyboard,Editbox,我需要在子窗口控件内连接alt+字母数字键 我写这个程序是为了测试它的功能。但它似乎对击键没有反应 像ALT+X、ALT+X,这是我的应用程序(键盘转换器)所必需的 #包括 #包括 #包括 #包括 #包括 #ifndefnull #定义空0 #恩迪夫 /*glaobal变量*/ HWND hwndeit=NULL; HWND hwndWindow=NULL; WCHAR*lpszClassName=L“Vijesekara键盘测试应用程序”; WCHAR*lpszAppName=L“Vijese

我需要在子窗口控件内连接alt+字母数字键

我写这个程序是为了测试它的功能。但它似乎对击键没有反应 像ALT+X、ALT+X,这是我的应用程序(键盘转换器)所必需的

#包括
#包括
#包括
#包括
#包括
#ifndefnull
#定义空0
#恩迪夫
/*glaobal变量*/
HWND hwndeit=NULL;
HWND hwndWindow=NULL;
WCHAR*lpszClassName=L“Vijesekara键盘测试应用程序”;
WCHAR*lpszAppName=L“Vijesekara键盘测试应用程序”;
int主窗口宽度=0;
int主窗口高度=0;
WNDPROC编辑_旧_WNDPROC;
/*
GWL_WNDPROC
*/
#ifndef GWL_WNDPROC
#定义GWL_WNDPROC(-4)
#恩迪夫
/*子窗口ID*/
#ifndef\u子窗口\u编辑\u ID__
#定义子窗口编辑ID__
#定义ID_编辑2000
//:TODO:更多来自这里//
#恩迪夫
/*子窗口位置上的约束*/
#ifndef\u子窗口\u位置__
#定义子窗口位置__
#定义编辑子项左项0.05
#定义编辑\u子项\u右项\u前项0.05
#定义编辑\u子项\u顶项\u前项0.10
#定义编辑\子项\底部\前项0.10
//:TODO:其他控件//
#恩迪夫
/*主窗口程序*/
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM);
/*编辑框程序*/
LRESULT回调EditBoxProc(HWND、UINT、WPARAM、LPARAM);
/*调整子窗口的大小*/
void ResizeChildWindows();
/*赢得主条目*/
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、,
PSTR szCmdLine,int iCmdShow)
{
WNDCLASS WNDCLASS;
wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=(hIcon)加载图标(NULL,IDI_应用程序);
wndclass.hCursor=(hCursor)LoadCursor(NULL,IDC_箭头);
wndclass.hbrBackground=(HBRUSH)GetStockObject(白色画笔);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=lpszClassName;
/*注册类*/
int结果;
结果=RegisterClass(&wndclass);
/*如果注册窗口失败*/
如果(0==结果)
{
MessageBox(空,L“注册窗口已失败”,lpszAppName,MB_OK);
出口(0);
}
/*创建窗口*/
hwndWindow=CreateWindow(lpszAppName、lpszAppName、WS_OVERLAPPEDWINDOW、CW_USEDEFAULT、CW_USEDEFAULT、\
CW_usefault,CW_usefault,NULL,NULL,hInstance,NULL);
如果(NULL==hwndWindow)
{
MessageBox(空,L“窗口创建失败”,lpszAppName,MB_OK);
出口(0);
}              
ShowWindow(hwndWindow、iCmdShow);
/*输入消息循环*/
味精;
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
} 
返回msg.wParam;
}
/*窗口程序*/
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM)
{
开关(信息)
{
案例WM_创建:
如果(hwndEdit!=NULL)
{
MessageBox(NULL,L“编辑控制句柄已初始化”,lpszAppName,MB_OK);
出口(0);
} 
HwnEdit=CreateWindow(L“编辑”,空,WS|u子项| WS|u可见| WS|u VSCROLL\
|WS|u BORDER | ES|u LEFT | ES|u MULTILINE | ES|u AUTOVSCROLL,0,0,0,hwnd,(humenu)ID|u EDIT\
,GetModuleHandle(NULL),NULL);
如果(NULL==hwndEdit)
{
MessageBox(hwnd,L“编辑子窗口控件创建失败”,lpszAppName,MB_OK);
出口(0);
}   
edit_old_wndproc=(wndproc)SetWindowLongPtr(hwnedit,GWL_wndproc,(LONG_PTR)EditBoxProc);
打破
案例WM_大小:
主窗口高度=HIWORD(LPRAM);
主窗口宽度=低位(LPRAM);
调整ChildWindows()的大小;
返回0;
case WM_命令:
/*:TODO:进程*/
打破
案例WM_销毁:
PostQuitMessage(0);
返回0;
违约:
返回DefWindowProc(hwnd、message、wParam、lParam);
}
返回DefWindowProc(hwnd、message、wParam、lParam);
}
/*调整窗口大小过程*/
void ResizeChildWindows()
{
移动窗口(hwndEdit、主窗口宽度*编辑子窗口左前、主窗口高度*编辑子窗口上前、\
主窗口宽度*(1-编辑子窗口左窗口前窗口-编辑子窗口右窗口前窗口),//高度
主窗口高度*(1-编辑子窗口顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部顶部
);  
}
静态int alt=0;
静态int-ctl=0;
静态int sys=0;
WCHAR缓冲区[1024];
LRESULT回调EditBoxProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM)
{
开关(信息)
{
案例WM_SYSCHAR:
sys=1;

如果(lpram&&(1好的,这很奇怪, 这是我的Alt+A键的spy+输出

然后我连接了WM_SYSKEYUP消息,修正如下:

case WM_SYSKEYUP:
  if( lParam && (1<<29) ) {alt=1;}else{break;}
  if( wParam == 'A' || wParam=='Z'|| wParam =='X' || wParam== 'W' || wParam == 'Y' ){}else{break;}

case WM_SYSCHAR:
  sys =1;
  if( lParam && (1<<29) ) { alt=1; }
  else { 
    alt=0;
    break;
  }

 case WM_CHAR:
  wsprintf( buffer,TEXT("KeyCode is :%d"), wParam);
  MessageBox( NULL,buffer, TEXT("Vijesekara Keyboard"), MB_OK);
  SetFocus(hwnd);
  /* keyboard procedure */


  alt =0;


  return 0;
case WM\u SYSKEYUP:

如果(lpram&&(1)如果有人按ALT+X,你得到的是WM\u SYSCHAR而不是WM\u CHAR。那么处理WM\u SYSCHAR。有什么问题吗?不,当我像其他字符一样按ALT+C时,我得到的是WM\u SYSCHAR,它对ALT+A ALT+X不起作用。我的问题不清楚吗?我会尝试改进它,同时,如果你愿意,尝试编辑它。我在修复pr后运行了你的示例代码像WM_KEYPRESS这样的问题不存在。我得到的是ALT+C、ALT+A和ALT+X的WM_SYSCHAR。你是在你的示例代码中,还是在另一个应用程序中遇到这个问题?如果是另一个应用程序,它是否有吞噬ALT+X的菜单、加速器或快捷键?不,我说的是同一个应用程序,你的意思是它确实显示了messagebox with keycode?说真的,在wndclass声明之后,我如上所述对其进行了初始化。我注释掉了WM_KEYPRESS。就是这样。代码在其他方面是相同的。如果您仍然没有获得ALT+A的WM_SYSCHAR,那么请运行spy++,看看您得到了什么消息以及处理它们的方式。请注意,这并没有回答问题上,但这将解决问题。为了发现相同错误的人的利益。
case WM_SYSKEYUP:
  if( lParam && (1<<29) ) {alt=1;}else{break;}
  if( wParam == 'A' || wParam=='Z'|| wParam =='X' || wParam== 'W' || wParam == 'Y' ){}else{break;}

case WM_SYSCHAR:
  sys =1;
  if( lParam && (1<<29) ) { alt=1; }
  else { 
    alt=0;
    break;
  }

 case WM_CHAR:
  wsprintf( buffer,TEXT("KeyCode is :%d"), wParam);
  MessageBox( NULL,buffer, TEXT("Vijesekara Keyboard"), MB_OK);
  SetFocus(hwnd);
  /* keyboard procedure */


  alt =0;


  return 0;