无法关闭 OSK.exe 在 Windows 10 下
Can' t close OSK.exe under Windows 10
我使用以下代码打开OSK.exe
HINSTANCE Dlg::ExecuteOSK()
{
typedef BOOL (WINAPI * LPFN_IsWow64Process)(HANDLE, PBOOL);
typedef BOOL (WINAPI * LPFN_Wow64DisableWow64FsRedirection)(PVOID *);
typedef BOOL (WINAPI * LPFN_Wow64RevertWow64FsRedirection)(PVOID);
LPFN_IsWow64Process fnIsWow64Process = NULL;
LPFN_Wow64DisableWow64FsRedirection fnWow64DisableWow64FsRedirection = NULL;
LPFN_Wow64RevertWow64FsRedirection fnWow64RevertWow64FsRedirection = NULL;
fnIsWow64Process = (LPFN_IsWow64Process) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
fnWow64DisableWow64FsRedirection = (LPFN_Wow64DisableWow64FsRedirection) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Wow64DisableWow64FsRedirection");
fnWow64RevertWow64FsRedirection = (LPFN_Wow64RevertWow64FsRedirection) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Wow64RevertWow64FsRedirection");
BOOL bIsWow64 = FALSE;
PVOID OldValue = NULL;
HINSTANCE handle;
if (NULL == fnIsWow64Process || NULL == fnWow64DisableWow64FsRedirection || NULL == fnWow64RevertWow64FsRedirection)
{
handle = ::ShellExecute(NULL, "open", "OSK", NULL, NULL, SW_SHOW);
}
else
{
fnIsWow64Process(GetCurrentProcess(), &bIsWow64);
if (TRUE == bIsWow64)
{
fnWow64DisableWow64FsRedirection(&OldValue);
handle = ::ShellExecute(NULL, "open", "OSK", NULL, NULL, SW_SHOW);
fnWow64RevertWow64FsRedirection(OldValue);
}
else
{
handle = ::ShellExecute(NULL, "open", "OSK", NULL, NULL, SW_SHOW);
}
}
return handle;
}
然后,我想在用户按Enter。
时关闭OSK.EXE。BOOL CALLBACK EnumWindowsProc(
_In_ HWND hwnd,
_In_ LPARAM lParam)
{
char name[256];
GetClassName( hwnd, name, sizeof(name) );
if(strcmp(name,"OSKMainClass") == 0)
SendMessage(hwnd, WM_CLOSE , NULL, NULL); //I have tried WM_DESTROY
return TRUE;
}
BOOL Dlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
int nKey = (int)pMsg->wParam;
switch(nKey)
{
case VK_RETURN:
EnumWindows(EnumWindowsProc, NULL);
}
}
return CBitmapDialog::PreTranslateMessage(pMsg);
}
但是,代码的这一部分不能用于关闭osk.exe成功。
我试图捕获另一个窗口,可以成功关闭。
这是Windows 10上的问题?
如果您想表现出osk.exe
的表现,您可以在此处查看-uiAccess="true"
这是用户界面特权隔离(UIPI),也可以阅读有关清单文件中类似问题的信息
因为osk.exe
在清单中具有uiAccess="true"
,它在令牌中具有Mandatory LabelHigh Mandatory Level
。但是您的应用程序,如果在UAC下运行,则通常具有Medium Mandatory Level
。结果:
较低特性的过程不能:
- 使用SendMessage或PostMessage对运行具有更高权利的应用程序Windows。这些API返回成功,但默默地放下了窗口 消息。
但是,如果您的应用程序在令牌中获得High Mandatory Level
-您可以通过下一个代码关闭osk.exe
:
if (HWND hwnd = FindWindow(L"OSKMainClass", 0))
{
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
因此,您需要在清单中使用<requestedExecutionLevel level='requireAdministrator' uiAccess='false'/>
或以某种方式运行您的应用程序作为高架
相关文章:
- 在Windows中以.exe的形式运行c++
- Eclipse 没有在 Windows (C++) 中编译.exe
- 如何从Windows控制台调用.exe(C++)以在不同的目录(或任何目录)中创建文件夹?
- 如何链接 DLL 以供 LoadLibrary() 使用(在 Windows 上的 C++ 中)并从调用 exe 导入变
- 父进程意外被子 cmd 杀死.exe运行 java jar 的进程 - WINDOWS 7 问题 - C++
- 我应该如何获取配置文件的绝对路径与 Windows .exe一起发布?
- C++程序工作,但 Windows 显示"程序.exe已停止工作"
- 如何在Windows上检查EXE是否具有/GS安全保护
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- 为没有qmake/VS的Qt Windows应用程序设置.exe图标
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- 显示和隐藏Windows 10屏幕键盘(osk.exe)时遇到问题
- 在 Windows 命令行中运行.exe在使用 2 种相同方式执行时会产生不同的输出
- C++应用程序仅在使用本地 Windows 调试器时运行,而不是哪个 exe 文件
- Visual Studio代码找不到g++.exe(Windows 10)
- "此版本的 C:\TURBOC3\BIN\TCC.EXE 与您运行的 Windows 版本不兼容。
- 是否可以使用 C++ 和 CMake 在 Linux 上创建 Windows exe
- App.Windows.exe中0x7725D4F2(ntdll.dll)处出现未处理的异常:0xC0000135:无法
- Visual Studio - 如何在没有导入表的情况下编译C++ Windows exe
- 如何将 msys shell 脚本转换为 Windows exe 文件