15,980
社区成员




int ret = 0;
ret = WinExec("osk.exe", SW_SHOWNORMAL);
//ret = WinExec("C:\\Program Files\\Common Files\\microsoft shared\\ink\\tabtip.exe", SW_SHOWNORMAL);
HINSTANCE hNewExe;
//hNewExe = ShellExecute(NULL, _T("open"), _T("osk.exe"), NULL, NULL, SW_SHOWNORMAL);
//hNewExe = ShellExecute(NULL, _T("open"), _T("C:\\Program Files\\Common Files\\microsoft shared\\ink\\tabtip.exe"), NULL, NULL, SW_SHOW);
//hNewExe = ShellExecute(NULL, _T("open"), _T("http://www.csdn.net"), NULL, NULL, SW_SHOWNORMAL);
CString strMsg;
strMsg.Format(_T("%d"), ret);
MessageBox(strMsg);
#include <Windows.h>
#include <WinBase.h>
typedef BOOL (CALLBACK * pWow64DisableWow64FsRedirection)(PVOID *OldValue);
typedef BOOL (CALLBACK * pWow64RevertWow64FsRedirection) (PVOID OldValue);
pWow64DisableWow64FsRedirection _Wow64DisableWow64FsRedirection;
pWow64RevertWow64FsRedirection _Wow64RevertWow64FsRedirection;
VOID SafeGetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo)
{
if (NULL==lpSystemInfo) return;
typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress( GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");
if (NULL != fnGetNativeSystemInfo)
{
fnGetNativeSystemInfo(lpSystemInfo);
}
else
{
GetSystemInfo(lpSystemInfo);
}
}
int GetSystemBits()
{
SYSTEM_INFO si;
SafeGetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == 9 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
{
return 64;
}
return 32;
}
// 部分系统打开osk.exe会失败
void RunExe(LPCWSTR lpName, int iShow = SW_SHOW)
{
SHELLEXECUTEINFO lpExecInfo = {0};
lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
lpExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
lpExecInfo.lpVerb = L"Open";
lpExecInfo.hwnd = NULL;
lpExecInfo.lpFile = lpName;
lpExecInfo.lpDirectory = L"\\windows";
lpExecInfo.nShow = SW_SHOW;
lpExecInfo.lpParameters = NULL;
lpExecInfo.hInstApp = NULL;
ShellExecuteEx(&lpExecInfo);
}
// 32位系统直接运行,64位系统启动独立线程
void RunExeEx(LPCSTR lpName, int iShow = SW_SHOWNORMAL)
{
if (GetSystemBits() == 64)
{
HMODULE HMODULE1 = LoadLibrary(_T("Kernel32.dll"));
if (HMODULE1 !=NULL)
{
_Wow64DisableWow64FsRedirection = (pWow64DisableWow64FsRedirection)GetProcAddress(HMODULE1,"Wow64DisableWow64FsRedirection");
_Wow64RevertWow64FsRedirection = (pWow64RevertWow64FsRedirection)GetProcAddress(HMODULE1,"Wow64RevertWow64FsRedirection");
if (Wow64DisableWow64FsRedirection!=NULL && _Wow64RevertWow64FsRedirection!=NULL)
{
PVOID OldValue;
BOOL bRet = Wow64DisableWow64FsRedirection (&OldValue);
WinExec(lpName, iShow);
if (bRet) {
_Wow64RevertWow64FsRedirection(OldValue);
}
}
FreeLibrary(HMODULE1);
}
}
else if(32 == GetSystemBits())
{
WinExec(lpName, iShow);
}
}
这是我用的方法,RunExe有写系统打开osk,tabtips会失败,下面的RunExeEx就不会;
具体原因现在想不起来,可以网上找一下;
void CdlgTDlg::OnBnClickedButton1()
{
HINSTANCE hr = ShellExecuteW(0, 0, L"osk.exe", 0, 0, SW_SHOWNORMAL);
ASSERT((int)hr >= 32);
}
PVOID OldValue = NULL;
BOOL bRet = Wow64DisableWow64FsRedirection(&OldValue);
//ret = WinExec("osk.exe", SW_SHOW); //这个打不开
hNewExe = ShellExecute(NULL, _T("open"), _T("osk.exe"), NULL, NULL, SW_SHOW);
if (bRet)
{
Wow64RevertWow64FsRedirection(OldValue);
}
打开tabtip.exe的问题谁能指导我一下
当任务管理器有 ”触摸键盘和手写面板“ 这个进程的时候,显示不出来,手动关闭这个进程才能显示,请问这个如何解决