2009-11-11 35 views
2

我正在为C++中的Windows Mobile开发,并且遇到了一个问题 - 我添加了我的窗口 类,并且在其中我使用了键盘输入WndProc执行。问题是 我得到了错误的代码,并且错误地识别了诸如func键之类的键,并且使得它变得更糟,我得到的值(WM_KEYDOWN消息的wParam)作为两个电话之间的不同值我在这里进行测试 - 谁知道其他手机会发生什么。传输Win32 API WndProc从一个窗口到另一个窗口的密钥消息

在玩了很久以后,我发现如果我只是从 预定义的“EDIT”类创建一个窗口,我实际上是正确地得到输入(按字母/键)。

所以这个问题一定不能在手机中,而是获取消息的模式(在win32中有点新手,请原谅我缺乏知识)。我尝试过使用输入模式,但是使用EM_NUMBERS发送消息到我的窗口等,总是失败。

所以我想要做什么(虽然我打开的建议),不知何故只是从一些隐藏的编辑窗口中获取字符,并将它们转发到我的窗口。 (虽然我仍然需要我的窗口有焦点,所以它会对不同于WM_KEYDOWN之类的消息做出正确反应)

有没有办法做到这一点?

这是3'rd时候我问关于这个问题,我永远感谢大家谁试图帮助到目前为止

(如果我必须设法解决我的问题,但会更加感激)

下面是相关的代码摘录:

类注册:

WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; 
wc.lpfnWndProc = WndProc; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hInstance = hInstance; 
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ROADMAP)); 
wc.hCursor = 0; 
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
wc.lpszMenuName = 0; 
wc.lpszClassName = szWindowClass; 

window creation 
if (width == -1) width = CW_USEDEFAULT; 
if (height == -1) height = CW_USEDEFAULT; 
RoadMapMainWindow = CreateWindow(g_szWindowClass, szTitle, OVERLAPPEDWINDOW, 
           CW_USEDEFAULT, CW_USEDEFAULT, width, height, 
           NULL, NULL, g_hInst, NULL); 

MessageLoop 
// Main message loop: 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg);  
    } 
} 

WNDPROC摘录:

case WM_KEYDOWN: 
{ 
    WORD Code = (WORD)wParam; 
    int iRepeatTimes = (lParam & 0x0000FFFF); 
    int iScanCode = (lParam & 0x00FF0000) >> 16; 
    BOOL bALT_IsDown = (lParam & 0x20000000)? TRUE: FALSE; 
    BOOL bAlreadyPressed= (lParam & 0x40000000)? TRUE: FALSE; 
    BOOL bNowReleased = (lParam & 0x80000000)? TRUE: FALSE; 
    return DefWindowProc(hWnd, message, wParam, lParam); 
} 

回答

0

我还没有像你描述过的任何问题,所以我真的很希望看到一组可以重现这一点的代码。据了解,some phones get spurrious user-range messages但这些不应该影响你在你的水平。事实上,你得到错误的代码如此基本的事实告诉我,你的窗口创建或消息处理代码中必须有错误。

+0

我在下面 – dan 2009-11-11 17:43:28

2

WM_KEYDOWN的wParam参数是不是真的约束为是ascii(或Unicode)字符的虚拟键码 - 其简单地唯一地标识所述平台上的键的码。

如果你想在“文” - 要等待WM_CHAR消息 - 的WM_CHAR的wParam参数将是用户输入的实际字符值。


更多信息 - 在您的应用程序循环 - 在您调用TranslateMessage - 它实际上是TranslateMessage工作现货WM_KEYDOWN消息以及合成并发布相应的WM_CHAR消息。


TranslateAccelerator似乎是可以发过帖子干扰的唯一的事情。 当然,有时候非常不寻常的行为能体现如果Windows消息PROC是(或没有),在错误的时间交给消息DefWindowProc。例如,为什么你在WM_KEYDOWN处理程序中有明确的电话DefWindowProc?处理这个问题的最简单方法是让DefWindowProc作为窗口处理程序的最后一件事情,以便所有处理和未处理的消息都默认处理。例外情况将是您想要阻止DefWindowProc收到邮件的邮件(例如,如果您处理它,则为WM_PAINT)。


也不断提尝试使用Edit_SetInputMode - Edit_SetInputMode将消息发送到窗口:EM_SETINPUTMODE - 这只有通过编辑控件了解的消息。当你注册了你自己的窗口类时,'EM_SETINPUTMODE'将不会做任何事情。

+0

一些代码摘录我其实有也WM_CHAR代码,问题是, 不幸的是,这正是错误 - 在某些键我得到的KEYDOWN消息,但没有得到正确翻译为CHAR消息。 (有时它会转换,但不同的字符:() – dan 2009-11-12 08:04:46

+0

如果WM_CHAR是不是你所期望的,那么你有一些更大的问题的地方和这些symtoms是一些更基本的指示。 – 2009-11-12 09:59:55

+0

有啥可引起不WM_KEYDOWN要interpereted到WM_CHAR 你能看到什么毛病我的类定义 – dan 2009-11-12 10:16:39

0

我只是猜测,但也许你的应用程序是一个Ansi应用程序?这也许可以解释不同的代码页给你不同的键码。那么你是否试图在项目设置中将所有的Unicode都设为Unicode,并相应地定义字符串常量?你有没有尝试ctacke的建议,使一个非常基本的应用程序?

相关问题