none
api寫入檔名 RRS feed

  • 問題

  • 大大您們好,我目前在做當關機時,利用程式關閉目前有開的檔案並儲存,所以利用api模擬使用者按鍵方式,但在寫入檔名時有個問題,如果這時語系是中文的話,貼出(程式模擬)的路徑會有錯誤,若目前語系是英文則不會有問題,我覺得是因為我利用SendKeys.SendWait(FileName);的關係,請問大大,我該朝哪個方向解決,謝謝
    2010年3月2日 上午 07:42

解答

  • 有中文字的話,要先判斷目標視窗為 ANSI Window 還是 Unicode Window

    Word 是 Unicode Window ,用 API SendMessage WM_IME_CHAR 時,要用 Encoding.Unicode 轉。
    notepad 是 Ansi Window ,用 API SendMessage WM_IME_CHAR 時,要用 Encoding.Default 轉。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 冰糖旋風 2010年3月3日 上午 05:52
    2010年3月2日 下午 03:30
  • Hi,

    用System.IO.Path.GetTempFileName();會建立暫存檔並回傳檔案完整路徑
    若依你的需求使用
    可能某些程式會跳出是否覆蓋的對話框
    想想也不方便
    若要使用
    也許要搭配DeleteFile才行
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2010年3月3日 上午 05:52
    2010年3月3日 上午 04:04

所有回覆

  • Hi,
    為何要用api模擬按鍵?
    你關機時儲存的不是自己程式開啟的檔案嗎?
    不能直接呼叫你內部存檔的函式嗎?
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月2日 上午 07:59
  • 大大您好,關閉的可能是word, notepad之類的,謝謝
    2010年3月2日 上午 08:15
  • Hi,

    可以的話
    附上出問題的存檔檔名
    並解釋一下中文與英文所貼上的字串
    正確的字串又應該為何
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月2日 上午 09:50
  • 大大您好
    檔名:c:\\tmp\\KAVFGVPVBPMQFESPJJTU,
    英文的語言列上檔名"c:\\tmp\\KAVFGVPVBPMQFESPJJTU",但若此時是中文的語言列,檔名變成":\\KAVFGVPVBPMQFESPJJTU",謝謝
    2010年3月2日 上午 10:27
  • Hi,

    你的檔名是從哪邊抓的?
    SendKeys.SendWait送出後才變成這樣?
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月2日 上午 10:32
  • 檔名是一開始我用亂數產生的,但c:\\tmp是固定的,我認為是送出後,因為我看到程式貼上檔名了,然後就出錯了,謝謝大大
    2010年3月2日 上午 10:58
  • Hi,

    我測是正常的
            private void button1_Click(object sender, EventArgs e)
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
                //System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-TW");
                string file = System.IO.Path.GetTempFileName();
                textBox1.Focus();
                textBox1.Text = file;
            }

    另外一提
    要造Temp可以使用 System.IO.Path.GetTempFileName()
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年3月2日 上午 11:41
  • 有中文字的話,要先判斷目標視窗為 ANSI Window 還是 Unicode Window

    Word 是 Unicode Window ,用 API SendMessage WM_IME_CHAR 時,要用 Encoding.Unicode 轉。
    notepad 是 Ansi Window ,用 API SendMessage WM_IME_CHAR 時,要用 Encoding.Default 轉。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 冰糖旋風 2010年3月3日 上午 05:52
    2010年3月2日 下午 03:30
  • 大大您好,可是我是要將WORD不是關閉後會問你儲存位置,我是要將檔名貼至上面的,目前我已經可以抓到此視窗的HANDLE碼,這樣仍可以使用System.IO.Path.GetTempFileName();嗎,謝謝

    2010年3月3日 上午 02:03
  • Hi,

    用System.IO.Path.GetTempFileName();會建立暫存檔並回傳檔案完整路徑
    若依你的需求使用
    可能某些程式會跳出是否覆蓋的對話框
    想想也不方便
    若要使用
    也許要搭配DeleteFile才行
    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2010年3月3日 上午 05:52
    2010年3月3日 上午 04:04