2014-11-15 18 views
-1

我正在製作自己的「寫字板」類型的東西,並且我已經用文本框以通常的方式成功完成了它,但現在我正在使用「UserActivityHooks .cs「程序。我遇到的問題是當他們按空格鍵時,它會打印:HiSpaceMom而不是:嗨,媽媽。有什麼方法可以過濾掉嗎?我試圖用這個:C#在UserActivityHooks.cs中過濾出「空格」鍵

UserActivityHook hook; 
    string log = string.Empty; 

    public Form1() 
    { 
     InitializeComponent(); 
     this.WindowState = FormWindowState.Minimized; 
     this.ShowInTaskbar = false; 
     hook = new UserActivityHook(); 
     hook.KeyUp += (s, e) => 
      { 
       log += e.KeyData.ToString(); 
       if (log == "Space") 
       { 
        log = " "; 
       } 
       textLogs.Text = log; 
      }; 

但這種方法時,「空間」是孤獨的,而不是旁邊的其他任何字符纔有效。任何人都可以幫忙嗎?源代碼是在這裏: http://code.google.com/p/wikipedia-aloud-reader/source/browse/trunk/WikiReader/UserActivityHook.cs?r=4

+0

我仍然不清楚實際問題是什麼? – Rahul

+0

我不知道爲什麼「空間」這個詞顯示,這是你應該找到我的意見。但是你可以用'log = log.Replace(「Space」,「」);'替換它 – Matthijs

回答

1

根據您上面提供的代碼,發生這種情況的原因是因爲你檢查平等日誌"Space",而不是e.KeyData對象。因爲你一直在建立日誌,所以log == "Space"永遠只會是第一次,如果遇到的第一個字符是空格。此後log == "Space"將永遠不會成爲現實。 (除非用戶實際輸入字符「Space」,但這不是你想要轉換的東西 - 進一步的理由來改變你的設計。)

此外,你在你之前添加KeyData字符串到你的日誌即使檢查它,所以即使您修復了條件,也不會按原樣工作。對事物

兩個點,你可以做些什麼來解決這個:

  1. 檢查是否e.KeyData.ToString() == Space,不log

  2. 如果您正在構建長日誌,那麼您將遇到與日誌字符串相關的性能問題。您應該使用StringBuilder,而不是將每個字符附加到它,並在需要使用或寫入時將其轉換爲string。就目前而言,每當你添加一個角色時,你最終會創建一個全新的字符串。

因此,這段代碼的修復後的版本可能看起來像以下:

// log is defined above as a StringBuilder 
hook.KeyUp += (s, e) => 
{ 
    if (e.KeyData.ToString() == "Space") 
    { 
     log.Append(" "); 
    } 
    else 
    { 
     log.Append(e.KeyData.ToString()); 
    } 
    textLogs.Text = log.ToString(); 
}; 

最後一兩件事 - 儘管這應該讓你的實現做你打算,有一些非常嚴重的缺陷,它似乎會工作。如果用戶想要刪除他們剛剛寫入的單詞,或者想要更改他們在50個字符前編寫的單詞,會發生什麼情況?就目前而言,你已經做出了一種看起來像一個完美的服務,如果基本的鍵盤記錄器,但我不知道你打算如何讓用戶做任何事情,但只寫一個完美拼寫/格式化的字符串之後他們不能進行任何編輯。 (另外 - 如果他們按ControlShiftAlt會發生什麼?您是否在其他地方處理?)