diff --git a/fpdfsdk/include/formfiller/FFL_ComboBox.h b/fpdfsdk/include/formfiller/FFL_ComboBox.h
index 7355045..c943511 100644
--- a/fpdfsdk/include/formfiller/FFL_ComboBox.h
+++ b/fpdfsdk/include/formfiller/FFL_ComboBox.h
@@ -47,7 +47,6 @@
   void RestoreState(CPDFSDK_PageView* pPageView) override;
   CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView,
                            FX_BOOL bRestoreValue) override;
-  void OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag) override;
 
   // IPWL_FocusHandler:
   void OnSetFocus(CPWL_Wnd* pWnd) override;
diff --git a/fpdfsdk/include/formfiller/FFL_FormFiller.h b/fpdfsdk/include/formfiller/FFL_FormFiller.h
index 352b695..5cfa2b6 100644
--- a/fpdfsdk/include/formfiller/FFL_FormFiller.h
+++ b/fpdfsdk/include/formfiller/FFL_FormFiller.h
@@ -103,8 +103,6 @@
   virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView,
                                    FX_BOOL bRestoreValue);
 
-  virtual void OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag);
-
   CPDF_Matrix GetCurMatrix();
 
   CPDF_Rect FFLtoPWL(const CPDF_Rect& rect);
diff --git a/fpdfsdk/include/formfiller/FFL_IFormFiller.h b/fpdfsdk/include/formfiller/FFL_IFormFiller.h
index 1c1fd07..723aa2b 100644
--- a/fpdfsdk/include/formfiller/FFL_IFormFiller.h
+++ b/fpdfsdk/include/formfiller/FFL_IFormFiller.h
@@ -149,9 +149,7 @@
                        FX_FLOAT fPopupMax,
                        int32_t& nRet,
                        FX_FLOAT& fPopupRet) override;
-  void OnBeforeKeyStroke(FX_BOOL bEditOrList,
-                         void* pPrivateData,
-                         int32_t nKeyCode,
+  void OnBeforeKeyStroke(void* pPrivateData,
                          CFX_WideString& strChange,
                          const CFX_WideString& strChangeEx,
                          int nSelStart,
@@ -160,10 +158,6 @@
                          FX_BOOL& bRC,
                          FX_BOOL& bExit,
                          FX_DWORD nFlag) override;
-  void OnAfterKeyStroke(FX_BOOL bEditOrList,
-                        void* pPrivateData,
-                        FX_BOOL& bExit,
-                        FX_DWORD nFlag) override;
 
   void UnRegisterFormFiller(CPDFSDK_Annot* pAnnot);
   void SetFocusAnnotTab(CPDFSDK_Annot* pWidget,
diff --git a/fpdfsdk/include/formfiller/FFL_ListBox.h b/fpdfsdk/include/formfiller/FFL_ListBox.h
index 01ad221..227f062 100644
--- a/fpdfsdk/include/formfiller/FFL_ListBox.h
+++ b/fpdfsdk/include/formfiller/FFL_ListBox.h
@@ -35,7 +35,6 @@
   void RestoreState(CPDFSDK_PageView* pPageView) override;
   CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView,
                            FX_BOOL bRestoreValue) override;
-  void OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag) override;
 
  private:
   CBA_FontMap* m_pFontMap;
diff --git a/fpdfsdk/include/pdfwindow/PWL_Edit.h b/fpdfsdk/include/pdfwindow/PWL_Edit.h
index 25da591..2b59421 100644
--- a/fpdfsdk/include/pdfwindow/PWL_Edit.h
+++ b/fpdfsdk/include/pdfwindow/PWL_Edit.h
@@ -24,9 +24,7 @@
       FX_FLOAT fPopupMax,
       int32_t& nRet,
       FX_FLOAT& fPopupRet) = 0;  // nRet: (0:bottom 1:top)
-  virtual void OnBeforeKeyStroke(FX_BOOL bEditOrList,
-                                 void* pPrivateData,
-                                 int32_t nKeyCode,
+  virtual void OnBeforeKeyStroke(void* pPrivateData,
                                  CFX_WideString& strChange,
                                  const CFX_WideString& strChangeEx,
                                  int nSelStart,
@@ -35,10 +33,6 @@
                                  FX_BOOL& bRC,
                                  FX_BOOL& bExit,
                                  FX_DWORD nFlag) = 0;
-  virtual void OnAfterKeyStroke(FX_BOOL bEditOrList,
-                                void* pPrivateData,
-                                FX_BOOL& bExit,
-                                FX_DWORD nFlag) = 0;
 
   virtual void OnPopupPreOpen(void* pPrivateData,
                               FX_BOOL& bExit,
diff --git a/fpdfsdk/src/formfiller/FFL_ComboBox.cpp b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
index ea8d295..b4619cb 100644
--- a/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
+++ b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
@@ -256,24 +256,6 @@
   return pRet;
 }
 
-void CFFL_ComboBox::OnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag) {
-  ASSERT(m_pWidget != NULL);
-
-  int nFlags = m_pWidget->GetFieldFlags();
-
-  if (nFlags & FIELDFLAG_COMMITONSELCHANGE) {
-    if (m_bValid) {
-      CPDFSDK_PageView* pPageView = GetCurPageView();
-      ASSERT(pPageView != NULL);
-
-      if (CommitData(pPageView, nFlag)) {
-        DestroyPDFWindow(pPageView);
-        m_bValid = FALSE;
-      }
-    }
-  }
-}
-
 FX_BOOL CFFL_ComboBox::IsFieldFull(CPDFSDK_PageView* pPageView) {
   if (CPWL_ComboBox* pComboBox =
           (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE)) {
diff --git a/fpdfsdk/src/formfiller/FFL_FormFiller.cpp b/fpdfsdk/src/formfiller/FFL_FormFiller.cpp
index 30a297d..b622429 100644
--- a/fpdfsdk/src/formfiller/FFL_FormFiller.cpp
+++ b/fpdfsdk/src/formfiller/FFL_FormFiller.cpp
@@ -602,8 +602,6 @@
   return m_pApp->GetSysHandler();
 }
 
-void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag) {}
-
 void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView,
                                    FX_BOOL bDestroyPDFWindow) {
   m_bValid = FALSE;
diff --git a/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
index c1450f6..6ef8785 100644
--- a/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
+++ b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
@@ -986,9 +986,7 @@
   return FALSE;
 }
 
-void CFFL_IFormFiller::OnBeforeKeyStroke(FX_BOOL bEditOrList,
-                                         void* pPrivateData,
-                                         int32_t nKeyCode,
+void CFFL_IFormFiller::OnBeforeKeyStroke(void* pPrivateData,
                                          CFX_WideString& strChange,
                                          const CFX_WideString& strChangeEx,
                                          int nSelStart,
@@ -1078,16 +1076,3 @@
     }
   }
 }
-
-void CFFL_IFormFiller::OnAfterKeyStroke(FX_BOOL bEditOrList,
-                                        void* pPrivateData,
-                                        FX_BOOL& bExit,
-                                        FX_DWORD nFlag) {
-  CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
-  ASSERT(pData->pWidget);
-
-  CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
-
-  if (!bEditOrList)
-    pFormFiller->OnKeyStroke(bExit, nFlag);
-}
diff --git a/fpdfsdk/src/formfiller/FFL_ListBox.cpp b/fpdfsdk/src/formfiller/FFL_ListBox.cpp
index 0f478fe..3436830 100644
--- a/fpdfsdk/src/formfiller/FFL_ListBox.cpp
+++ b/fpdfsdk/src/formfiller/FFL_ListBox.cpp
@@ -228,21 +228,3 @@
 
   return pRet;
 }
-
-void CFFL_ListBox::OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag) {
-  ASSERT(m_pWidget != NULL);
-
-  int nFlags = m_pWidget->GetFieldFlags();
-
-  if (nFlags & FIELDFLAG_COMMITONSELCHANGE) {
-    if (m_bValid) {
-      CPDFSDK_PageView* pPageView = GetCurPageView();
-      ASSERT(pPageView != NULL);
-
-      if (CommitData(pPageView, nFlag)) {
-        DestroyPDFWindow(pPageView);
-        m_bValid = FALSE;
-      }
-    }
-  }
-}
diff --git a/fpdfsdk/src/pdfwindow/PWL_Edit.cpp b/fpdfsdk/src/pdfwindow/PWL_Edit.cpp
index 3271c80..8e45060 100644
--- a/fpdfsdk/src/pdfwindow/PWL_Edit.cpp
+++ b/fpdfsdk/src/pdfwindow/PWL_Edit.cpp
@@ -163,7 +163,7 @@
     int nSelStart = 0;
     int nSelEnd = 0;
     GetSel(nSelStart, nSelEnd);
-    m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), 0, swClipboard,
+    m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swClipboard,
                                        strChangeEx, nSelStart, nSelEnd, TRUE,
                                        bRC, bExit, 0);
     if (!bRC)
@@ -176,13 +176,6 @@
     Clear();
     InsertText(swClipboard.c_str());
   }
-
-  if (m_pFillerNotify) {
-    FX_BOOL bExit = FALSE;
-    m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit, 0);
-    if (bExit)
-      return;
-  }
 }
 
 void CPWL_Edit::CutText() {
@@ -883,9 +876,9 @@
 
       if (nSelStart == nSelEnd)
         nSelEnd = nSelStart + 1;
-      m_pFillerNotify->OnBeforeKeyStroke(
-          TRUE, GetAttachedData(), FWL_VKEY_Delete, strChange, strChangeEx,
-          nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag);
+      m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), strChange,
+                                         strChangeEx, nSelStart, nSelEnd, TRUE,
+                                         bRC, bExit, nFlag);
       if (!bRC)
         return FALSE;
       if (bExit)
@@ -895,15 +888,6 @@
 
   FX_BOOL bRet = CPWL_EditCtrl::OnKeyDown(nChar, nFlag);
 
-  if (nChar == FWL_VKEY_Delete) {
-    if (m_pFillerNotify) {
-      FX_BOOL bExit = FALSE;
-      m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit, nFlag);
-      if (bExit)
-        return FALSE;
-    }
-  }
-
   // In case of implementation swallow the OnKeyDown event.
   if (IsProceedtoOnChar(nChar, nFlag))
     return TRUE;
@@ -940,9 +924,8 @@
     case FWL_VKEY_Space:
       return TRUE;
     default:
-      break;
+      return FALSE;
   }
-  return FALSE;
 }
 
 FX_BOOL CPWL_Edit::OnChar(FX_WORD nChar, FX_DWORD nFlag) {
@@ -952,11 +935,9 @@
   FX_BOOL bRC = TRUE;
   FX_BOOL bExit = FALSE;
 
-  FX_BOOL bCtrl = IsCTRLpressed(nFlag);
-  if (!bCtrl) {
+  if (!IsCTRLpressed(nFlag)) {
     if (m_pFillerNotify) {
       CFX_WideString swChange;
-      int32_t nKeyCode;
 
       int nSelStart = 0;
       int nSelEnd = 0;
@@ -964,23 +945,20 @@
 
       switch (nChar) {
         case FWL_VKEY_Back:
-          nKeyCode = nChar;
           if (nSelStart == nSelEnd)
             nSelStart = nSelEnd - 1;
           break;
         case FWL_VKEY_Return:
-          nKeyCode = nChar;
           break;
         default:
-          nKeyCode = 0;
           swChange += nChar;
           break;
       }
 
       CFX_WideString strChangeEx;
-      m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), nKeyCode,
-                                         swChange, strChangeEx, nSelStart,
-                                         nSelEnd, TRUE, bRC, bExit, nFlag);
+      m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swChange,
+                                         strChangeEx, nSelStart, nSelEnd, TRUE,
+                                         bRC, bExit, nFlag);
     }
   }
 
@@ -996,17 +974,8 @@
       SetCharSet(nNewCharSet);
     }
   }
-  FX_BOOL bRet = CPWL_EditCtrl::OnChar(nChar, nFlag);
 
-  if (!bCtrl) {
-    if (m_pFillerNotify) {
-      m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit, nFlag);
-      if (bExit)
-        return FALSE;
-    }
-  }
-
-  return bRet;
+  return CPWL_EditCtrl::OnChar(nChar, nFlag);
 }
 
 FX_BOOL CPWL_Edit::OnMouseWheel(short zDelta,
diff --git a/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp b/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp
index b252bff..4bdcb5d 100644
--- a/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp
+++ b/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp
@@ -374,20 +374,17 @@
 void CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown,
                                       FX_BOOL& bExit,
                                       FX_DWORD nFlag) {
-  if (m_pFillerNotify) {
-    FX_BOOL bRC = TRUE;
-    CFX_WideString swChange = GetText();
-    CFX_WideString strChangeEx;
-    int nSelStart = 0;
-    int nSelEnd = swChange.GetLength();
-    m_pFillerNotify->OnBeforeKeyStroke(FALSE, GetAttachedData(), 0, swChange,
-                                       strChangeEx, nSelStart, nSelEnd,
-                                       bKeyDown, bRC, bExit, nFlag);
-    if (bExit)
-      return;
+  if (!m_pFillerNotify)
+    return;
 
-    m_pFillerNotify->OnAfterKeyStroke(FALSE, GetAttachedData(), bExit, nFlag);
-  }
+  FX_BOOL bRC = TRUE;
+  CFX_WideString swChange = GetText();
+  CFX_WideString strChangeEx;
+  int nSelStart = 0;
+  int nSelEnd = swChange.GetLength();
+  m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swChange, strChangeEx,
+                                     nSelStart, nSelEnd, bKeyDown, bRC, bExit,
+                                     nFlag);
 }
 
 CPDF_Rect CPWL_ListBox::GetFocusRect() const {
