如何实现右键通过指定C++程序打开/运行文件?技术求助
Got it, let's break this down by platform—since file association systems are totally different across Windows, macOS, and Linux. This will make your custom script language feel like a native tool, exactly what you're aiming for!
Windows: Use the Registry
Windows relies on the Registry to map file extensions to programs. You can set this up manually, or automate it with C++ code (great for installers).
Manual Setup
- Pick a file extension for your scripts (e.g.,
.phon). - Open the Registry Editor by running
regeditin the Start Menu. - Navigate to
HKEY_CLASSES_ROOT, then:- Create a new key named
.phon, set its default value toPhonScriptFile(this is a unique identifier for your file type). - Create a new key named
PhonScriptFile, set its default value to "Phon Script File" (the friendly name users will see). - Under
PhonScriptFile, create the nested pathshell\open\command. Set the default value ofcommandto:
The"C:\Full\Path\To\Your\interpreter.exe" "%1"%1will pass the clicked file's path directly to your C++ program as a command-line argument.
- Create a new key named
- To make the system recognize the change immediately, run this command in Command Prompt:
rundll32.exe shell32.dll,SHChangeNotify 0x08000000, 0x0000, 0, 0
Automated Registration with C++
Use Windows Registry APIs to add these entries programmatically. Note: This requires administrator privileges to modify HKEY_CLASSES_ROOT.
#include <windows.h> #include <string> bool RegisterPhonScriptAssociation(const std::wstring& exePath) { const std::wstring ext = L".phon"; const std::wstring progID = L"PhonScriptFile"; const std::wstring description = L"Phon Script File"; // Register the extension to our progID HKEY hKey; if (RegCreateKeyExW(HKEY_CLASSES_ROOT, ext.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) { return false; } RegSetValueExW(hKey, NULL, 0, REG_SZ, (BYTE*)progID.c_str(), (progID.size() + 1) * sizeof(wchar_t)); RegCloseKey(hKey); // Register the progID's display name if (RegCreateKeyExW(HKEY_CLASSES_ROOT, progID.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) { return false; } RegSetValueExW(hKey, NULL, 0, REG_SZ, (BYTE*)description.c_str(), (description.size() + 1) * sizeof(wchar_t)); RegCloseKey(hKey); // Register the "Open" command const std::wstring commandPath = progID + L"\\shell\\open\\command"; if (RegCreateKeyExW(HKEY_CLASSES_ROOT, commandPath.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS) { return false; } const std::wstring command = L"\"" + exePath + L"\" \"%1\""; RegSetValueExW(hKey, NULL, 0, REG_SZ, (BYTE*)command.c_str(), (command.size() + 1) * sizeof(wchar_t)); RegCloseKey(hKey); // Notify the system of the association change SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); return true; } // Usage example (call this with admin rights): // RegisterPhonScriptAssociation(L"C:\\Projects\\phon-interpreter\\Release\\phon-interpreter.exe");
macOS: Use App Bundles & Info.plist
macOS prefers apps packaged as .app bundles. You'll need to wrap your C++ executable in one, then define file associations via the bundle's Info.plist.
Step 1: Create the App Bundle
Make a folder structure like this:
PhonInterpreter.app/ Contents/ Info.plist MacOS/ phon-interpreter # Your compiled C++ executable Resources/ phon-icon.icns # Optional: Add a custom icon for your app
Step 2: Edit Info.plist
Add file association details to the plist. Replace placeholders with your own values:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleName</key> <string>Phon Interpreter</string> <key>CFBundleExecutable</key> <string>phon-interpreter</string> <key>CFBundleIdentifier</key> <string>com.yourdomain.phoninterpreter</string> <!-- Unique ID, e.g., reverse your website domain --> <key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeName</key> <string>Phon Script File</string> <key>CFBundleTypeExtensions</key> <array> <string>phon</string> <!-- Your script extension --> </array> <key>CFBundleTypeRole</key> <string>Editor</string> <key>LSHandlerRank</key> <string>Owner</string> <!-- Marks your app as the default for this file type --> </dict> </array> </dict> </plist>
Step 3: Register the Bundle
Move the PhonInterpreter.app to /Applications, then run this terminal command to tell macOS about the new association:
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -f /Applications/PhonInterpreter.app
Linux: Use MIME Types & .desktop Files
Linux desktop environments (GNOME, KDE, Xfce) follow the Freedesktop.org standards. You'll need to define a MIME type for your scripts and link it to your C++ executable via a .desktop file.
Step 1: Define a MIME Type
Create a file named text-x-phonscript.xml with this content:
<?xml version="1.0" encoding="UTF-8"?> <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info"> <mime-type type="text/x-phonscript"> <comment>Phon Script File</comment> <glob pattern="*.phon"/> <!-- Your script extension --> </mime-type> </mime-info>
- For user-level access: Place it in
~/.local/share/mime/packages/, then runupdate-mime-database ~/.local/share/mime/. - For system-level access: Place it in
/usr/share/mime/packages/, then runsudo update-mime-database /usr/share/mime/.
Step 2: Create a .desktop File
Make a file named phon-interpreter.desktop:
[Desktop Entry] Name=Phon Interpreter Exec=/full/path/to/phon-interpreter %F Type=Application MimeType=text/x-phonscript; Icon=/path/to/phon-icon.png <!-- Optional: Custom icon --> Categories=Development;
- For user-level access: Place it in
~/.local/share/applications/, then runupdate-desktop-database ~/.local/share/applications/. - For system-level access: Place it in
/usr/share/applications/, then runsudo update-desktop-database /usr/share/applications/.
Step 3: Set as Default
Run this terminal command to set your interpreter as the default for .phon files:
xdg-mime default phon-interpreter.desktop text/x-phonscript
Or right-click a .phon file, go to Properties > Open With, select your interpreter, and click Set as Default.
How Your C++ Program Receives the File Path
In all platforms, the clicked file's path is passed as a command-line argument to your program. Here's a simple main function to handle it:
#include <iostream> #include <string> int main(int argc, char* argv[]) { if (argc < 2) { std::cout << "Usage: " << argv[0] << " <phon-script-file>" << std::endl; return 1; } // Process each file passed as an argument for (int i = 1; i < argc; ++i) { std::string scriptPath = argv[i]; std::cout << "Executing script: " << scriptPath << std::endl; // Add your script parsing/execution logic here using scriptPath } return 0; }
内容的提问来源于stack exchange,提问作者Phonzi

