C#(.net8) 和 純C++ 在 WINDOWS 10/11 x64下 編譯x32/x64程式 正確呼叫系統內建應用程式(OSK.exe)
C#(.net8) 和 純C++ 在 WINDOWS 10/11 x64下 編譯x32/x64程式 正確呼叫系統內建應用程式(OSK.exe)
資料來源: AI(perplexity ~ C#) + (copilot ~C++)
GITHUB: https://github.com/jash-git/CS_CPP-call-osk-base-on-windows-11-x64-
perplexity ~ 如何使用C# 寫出一個可以在X64和X32模式下都可正常啟動OSK的範例
using System; using System.ComponentModel; using System.Diagnostics; using System.Runtime.InteropServices; namespace LaunchOSKExample { class Program { static void Pause() { Console.Write("Press any key to continue..."); Console.ReadKey(true); } static void Main(string[] args) { //Directory.GetParent 是 C# 中用來取得指定路徑的父目錄的靜態方法 //Environment.GetFolderPath 是 C# 中用來取得特殊文件夾路徑的方法。 //Environment.SpecialFolder.System 是 C# 中的一个枚举值,属于 System.Environment 类。它指向操作系统的系统文件夹路径。在 Windows 上,这通常是包含 Windows 系统文件的目录 bool is64BitOS = Environment.Is64BitOperatingSystem; bool is64BitProcess = Environment.Is64BitProcess; if (is64BitProcess) { Process.Start( Path.Combine( Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.System)).FullName, "System32", "cmd.exe"), "/c osk.exe"); } else { Process.Start( Path.Combine( Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.System)).FullName, "Sysnative", "cmd.exe"), "/c osk.exe"); } Pause(); } } }
copilot ~ 將上述C#轉換成C++
#include <iostream> #include <string> #include <windows.h> #include <shlobj.h> // For SHGetFolderPath #include <thread> #include <chrono> void Pause() { std::cout << "Press any key to continue..."; std::cin.get(); } std::string GetParentDirectory(const std::string& path) { size_t lastSlash = path.find_last_of("\\/"); if (lastSlash != std::string::npos) { return path.substr(0, lastSlash); } return path; } int main() { BOOL is64BitProcess = FALSE; if (sizeof(void*) == 4) { std::cout << "編譯結果為 32 位" << std::endl; is64BitProcess = FALSE; } else if (sizeof(void*) == 8) { std::cout << "編譯結果為 64 位" << std::endl; is64BitProcess = TRUE; } CHAR systemPath[MAX_PATH]; SHGetFolderPathA(NULL, CSIDL_SYSTEM, NULL, SHGFP_TYPE_CURRENT, systemPath); std::string systemParentPath = GetParentDirectory(systemPath); std::string command; if (is64BitProcess) { command = systemParentPath + "\\System32\\cmd.exe /c osk.exe"; } else { command = systemParentPath + "\\Sysnative\\cmd.exe /c osk.exe"; } STARTUPINFOA si = { sizeof(si) }; PROCESS_INFORMATION pi = {}; if (!CreateProcessA(NULL, const_cast<char*>(command.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { std::cerr << "Failed to launch process. Error: " << GetLastError() << std::endl; } else { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } Pause(); return 0; }
One thought on “C#(.net8) 和 純C++ 在 WINDOWS 10/11 x64下 編譯x32/x64程式 正確呼叫系統內建應用程式(OSK.exe)”
C#(.net8) 和 純C++ 在 WINDOWS 10/11 x64下 編譯x32/x64程式 正確 呼叫/執行 系統內建應用程式(OSK.exe)
判斷 x64/x32 編譯本身/作業系統
PS C++判斷 OS code
BOOL is64BitOS = FALSE;
#if defined(_WIN64)
is64BitOS = TRUE;
#else
BOOL isWow64 = FALSE;
if (IsWow64Process(GetCurrentProcess(), &isWow64))
{
is64BitOS = isWow64;
}
#endif