【发布时间】:2021-09-22 23:28:10
【问题描述】:
我正在开发一个使用 Windows 窗体进行设计的备份程序。
除了一个按钮外,一切都运行良好,所以我将保留整个代码。
我有一个按钮,允许用户从某个位置打开 CSV 文件以在其默认的 CSV 编辑器程序(即 Excel、Libre 等)中进行编辑,并且该按钮可以正常工作:
private: System::Void button17_Click(System::Object^ sender, System::EventArgs^ e) {
String^ CSVLoc = textBox1->Text;
string CSVLoc1 = msclr::interop::marshal_as<std::string>(CSVLoc);
system(("start " + CSVLoc1 + "\\SystemIPs.csv").c_str());
}
但是,我想避免使用 system 功能,因为我不喜欢它在启动默认编辑器程序时会闪烁命令窗口。
我试过了:
private: System::Void button17_Click(System::Object^ sender, System::EventArgs^ e) {
String^ CSVLoc = textBox1->Text;
string CSVLoc1 = msclr::interop::marshal_as<std::string>(CSVLoc);
WinExec(("start " + CSVLoc1 + "\\SystemIPs.csv").c_str(), SW_HIDE);
}
但是当我单击按钮时,它什么也没做。WinExec 可以替代我的其他系统功能命令,但不是在这里。
按钮的功能是不对我的程序进行任何编辑,因此不需要读取或写入它。只需要在默认编辑器中打开而不弹出命令窗口即可。
我已经搜索了几个小时试图找到一个没有运气的解决方案。
我对这里的任何建议持开放态度,即使它正在使用系统功能,但有一些我目前不知道的巧妙隐藏方式。
该程序仅适用于 Windows,并设置为作为 Windows 应用程序运行。使用 CLR 和 .Net 是 4.7.2。正如我提到的,一切正常,只是想找到一种方法来隐藏那个讨厌的命令窗口弹出窗口。
【问题讨论】:
-
String^ csvLoc = textBox1->Text; Process::Start(Path::Combine(csvLoc, "SystemIPs.csv"));-- 您应该指定正在使用的 .Net 版本。 -
您还可以看到:Launching Applications (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)(这里使用了什么引擎盖)。
-
Jimi,Process::Start 似乎未定义。我按照链接中的示例尝试了 ShellExecute,它拒绝了我的动词“open”,并且我的文件路径声明“类型的参数“const char *”与动词和路径的参数类型不兼容。
-
Process 类是 System::Diagnostics 的一部分,所以添加
using namespace System::Diagnostics;。 Path 类需要using namespace System::IO;。全部来自默认添加到项目引用中的mscorlib.dll程序集。 -
嘿 Jimi,正如我在对 Jack 的评论中所说,它运行良好。感谢您的帮助并教会了我一些新东西。
标签: windows visual-studio winforms csv c++-cli