How to get pass word in star symbols?
windows視窗中要輸入密碼的文字框
通常為了隱藏資訊都會顯示成*
但是這只是Edit控制項的一個屬性
只要稍微動點手腳,就可以將*號的內容讀出來
在這邊敘述一下流程
1. 首先設定一個Timer定時的去取得滑鼠的座標
2. 然後根據滑鼠指到的位置,使用 GetWindowLong 取得目前這個控制項的樣式
由於 ES_PASSWORD 本身就是 EditControl 的專用屬性
所以只要判斷有 ES_PASSWORD 他就一定是個 EditControl
當然也代表他有使用隱藏資訊啦^^
3. 對控制項發送 EM_SETPASSWORDCHAR 使得這個控制項的密碼屬性被關閉
4. 趕快把密碼讀出來XD
5. 再對控制項發送一次 EM_SETPASSWORDCHAR 讓密碼的屬性回復 ( 這樣才不會發現已經被讀取了 )
由於以上動作都在視窗重繪之前完成
所以並不會發生因為控制項閃爍而被發現的情形
以下為程式碼範例
// 請在 MFC 的 OnInitDialog 呼叫此函式 void CGetPasswordDlg::Init() { CWnd::SetTimer(0,300,CGetPasswordDlg::TimerProc); } void CGetPasswordDlg::TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) { POINT Point; ::GetCursorPos(&Point); HWND hwndCurr = ::WindowFromPoint(Point); // 取得類別名稱 char szClass[255]; ::memset(&szClass,0,sizeof(szClass)); ::GetClassName(hwndCurr, szClass,255); // 儲存密碼 char szPass[255]; ::memset(&szPass,0,sizeof(szPass)); // 取得式樣 LONG lStyle = ::GetWindowLong(hwndCurr,GWL_STYLE); // 檢查是否有加密 long lComp = lStyle & ES_PASSWORD; if(lComp!=0) { // 去除密碼屬性 ::PostMessage(hwndCurr, EM_SETPASSWORDCHAR, 0, 0); // 取出密碼 ::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szPass); // 回復密碼屬性 ::PostMessage(hwndCurr, EM_SETPASSWORDCHAR, (WPARAM) '*', 0); } else { ::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szPass); } CGetPasswordDlg* pDlg = (CGetPasswordDlg*)theApp.GetMainWnd(); char szTitle[255]; ::memset(&szTitle,0,sizeof(szTitle)); ::sprintf(szTitle,"%s hWnd=%d, x=%d, y=%d",TITLE, hwndCurr,Point.x, Point.y); pDlg->SetWindowText(szTitle); pDlg->mEdit.SetWindowText(szClass); pDlg->mPassWord.SetWindowText(szPass); }
在畫面的下方, 已經成功的將密碼讀取出來