2013-11-22 53 views
1

我試圖添加可能使用在已經取得登錄/密碼的形式返回鍵。如何在C++的登錄/密碼窗口中使用回車鍵?

的事情是,我沒有做的形式,而這是我第一次使用Windows中的窗口API。所以,有很多我不知道...

因此,基本上,創建一個窗口,在它的內部,三子「窗口」創建。

一個可編輯:登錄
中的第二個可編輯:密碼
以及按鈕:OK

基本上,我在消息回調方法添加一個句柄WM_CHAR:

else if (msg == WM_CHAR) 
{ 
    if (wParam == VK_RETURN) 
    { 
     char BufLogin[128]; 
     char BufPasswd[128]; 

     GetWindowText(hwndEditLogin, BufLogin, sizeof(BufLogin)); 
     GetWindowText(hwndEditPasswd, BufPasswd, sizeof(BufPasswd)); 
     print_msg(BufLogin); 
     print_msg(BufPasswd); 
     return (0); 
    } 
    else 
     return (DefWindowProcW(hwnd, msg, wParam, lParam)); 
} 

(我還用WM_KEYDOWN更換WM_CHAR沒有成功嘗試。)

我的堆棧溢出檢查,唯一的解決方案,我發現事情至今談話我不明白,或者乾脆不工作...
我在消息100g的添加了一個檢查,像這樣:

while(GetMessage(&msg, NULL, 0, 0)) 
{ 
    if (!IsDialogMessage(hWnd, &msg) || msg.wParam == VK_RETURN) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

而且它沒有工作,除非用戶點擊了任何子窗口上。 ..基本上,如果用戶沒有點擊任何東西或修改任何東西,它就會工作,這使得窗口的登錄/密碼部分非常無用! ^^'

所以我猜測是(!IsDialogMessage)檢查排除了WM_CHAR和WM_KEYDOWN消息(仍然允許用戶輸入某些原因),並且如果我添加了對wParam它可以工作,但只適用於父窗口。

如果你們對如何不要蜘蛛這個難題我的工作,任何想法,我將非常感激!提前致謝! :)

(PS:!我編輯了這個問題之前,我問及如何使TAB鍵工作,因爲檢查的IsDialogMessage會使每個字符出現四次,我只是忘了把!中的IsDialogMessage之前^ ^' 我做這個筆記,以防萬一有人發現我的問題,並且遇到同樣的問題,我編輯之前!))

+0

與常規窗口仿真進對話框的行爲當然是可能的,但是這是很難做到這一點完全正確(恕我直言)爲什麼不在RC文件和API CreateDialog中使用對話框模板? – manuell

+0

那麼......正如我所說,這部分代碼不是我的! :s 我不知道如何使用Dialog模板! :/ – Asahi

+0

好吧,對於我在做什麼有了更多的瞭解,下面是對您的評論的正確回答: RC文件是否定的,因爲窗口必須是運行時可編輯的! 而我通過在IsDialogMessage之前添加已忘記的'!'來使代碼生效! ^^」 – Asahi

回答

1

好的,所以我終於弄明白了!這是我的解決方案,如果有人需要這樣做!;)

我做了兩個全局變量,一個爲每個需要處理ENTER鍵窗口:

WNDPROC wpOldEditProcPass; 
WNDPROC wpOldEditProcLogin; 

然後,我創建了兩個CALLBACK方法,再次,每一個窗口:
(把他們之前我的主要CALLBACK

LRESULT CALLBACK CustomEditProcLogin(HWND hWnd, UINT msg, WPARAM wParam,  LPARAM lParam) 
{ 
switch (msg) 
{ 
    case WM_CHAR: 
    { 
     if (wParam == VK_RETURN) 
     { 
      SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(ID_BUTTON, BN_CLICKED), 0); 
      return(0); 
     } 
    } 
} 
CallWindowProc(wpOldEditProcLogin, hWnd, msg, wParam, lParam); 
} 

LRESULT CALLBACK CustomEditProcPass(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
switch (msg) 
{ 
    case WM_CHAR: 
    { 
     if (wParam == VK_RETURN) 
     { 
      SendMessage(GetParent(hWnd), WM_COMMAND,  MAKEWPARAM(ID_BUTTON, BN_CLICKED), 0); 
      return(0); 
     } 
    } 
} 
CallWindowProc(wpOldEditProcPass, hWnd, msg, wParam, lParam); 
} 

在主CALLBACK,在WM_CREATE手柄,我創建了子窗口後,我的子類他們:

wpOldEditProcPass = (WNDPROC)SetWindowLongPtr(hwndEditPasswd, GWLP_WNDPROC, (LONG_PTR)CustomEditProcPass); 
wpOldEditProcLogin = (WNDPROC)SetWindowLongPtr(hwndEditLogin, GWLP_WNDPROC, (LONG_PTR)CustomEditProcLogin); 

然後在WM_DESTROY,我給他們回原來的流程:
(PostQuitMessage前(0); )

SetWindowLongPtr(hwndEditPasswd, GWLP_WNDPROC, (LONG_PTR)wpOldEditProcPass); 
SetWindowLongPtr(hwndEditLogin, GWLP_WNDPROC, (LONG_PTR)wpOldEditProcLogin); 

然後我更換了:

if (!IsDialogMessage(hWnd, &msg)) 

有了:

if (!IsDialogMessage(hWnd, &msg) ||(msg.message == WM_KEYDOWN && msg.wParam == VK_RETURN)) 

它就像一個魅力! :D

(我仍然不知道爲什麼我必須允許WM_KEYDOWN消息,但處理WM_CHAR消息...如果我允許WM_CHAR消息,它不起作用,如果我處理WM_KEYDOWN消息時,我得到了討厭的「鼎」的聲音時,我按回車鍵!^^」)