visual-studio 控制Windows螢幕小鍵盤的方法(非administrator)

環境

  • OS: Windows7
  • IDE:Visual Studio 2012

0.功能描述

windows 在使用螢幕小鍵盤的時候,千萬不要傻傻的自己撰寫一個虛擬鍵盤,你以前 XP 時代或許還行得通,但碰到現在 UAC 時代(vista 以後預設都是開啟),你最好就是直接用作業系統提供的,好處很多,不用自己撰寫多國語系,就算客戶有埋怨,我們也可以跟客戶講說,我們是呼叫系統的。

1.呼叫小鍵盤

簡單的用 cmd 方式就可以呼叫了

ShellExecute( NULL, NULL, L"osk", NULL,NULL,SW_SHOW);

用 FindWindow 確認有沒有開啟成功。

if(::FindWindow(L"OSKMainClass", NULL))
{
    printf("osk open successed\n");
}

2.移動小鍵盤

MoveWindow 或是 SetWindowPos 在 UAC 的狀態下,用一般使用者都是沒辦法移動小鍵盤了,所以呢,呼叫小鍵盤前,需要去修改”登錄擋”,沒錯就是登錄擋,HKEY_CURRENT_USER\SOFTWARE\Microsoft\Osk,到這個位置把參數換一換就能夠達到 MoveWindow 的功能了。

DWORD WindowLeft=0;//視窗左上角的位置
DWORD WindowTop=0;//視窗左上角的位置
DWORD WindowWidth=1024//視窗左上角的位置
DWORD WindowHeight=768//視窗左上角的位置
HKEY hKey;
LPCTSTR sk = TEXT("SOFTWARE\\Microsoft\\Osk");

LONG openRes = RegOpenKeyEx(HKEY_CURRENT_USER, sk, 0, KEY_ALL_ACCESS , &hKey);

if (openRes==ERROR_SUCCESS)
{
    printf("Success opening key.");
    auto lambda = [=] (const wchar_t *valuename,DWORD value){
        LONG setRes = RegSetValueEx(hKey, valuename, 0, REG_DWORD, (const BYTE*)&value, sizeof(value));

        if (setRes == ERROR_SUCCESS)
        {
            wprintf(L"Success writing to Registry. valuename = %s value = %d",valuename,value);
        } else
        {
            wprintf(L"Error writing to Registry. valuename = %s value = %d",valuename,value);
        }
        //cout << setRes << endl;
    };

    lambda(L"WindowLeft",WindowLeft);
    lambda(L"WindowTop",WindowTop);
    lambda(L"WindowWidth",WindowWidth);
    lambda(L"WindowHeight",WindowHeight);
    lambda(L"UseTextPrediction",0); //關閉文字預測
    lambda(L"NavigationMode",0); //關閉 Nav模式

    LONG closeOut = RegCloseKey(hKey);
    if (closeOut == ERROR_SUCCESS)
    {
        printf("Success closing key.");
    } else
    {
        printf("Error closing key.");
    }
} else
{
    printf("Error opening key.");
}

3.關閉小鍵盤&修改一些客製參數

用 SendMessage 對 osk 發送 SC_CLOSE 即可

HWND hKbd=0;
hKbd = ::FindWindowW(L"OSKMainClass",NULL);
if(hKbd)
{
    ::SendMessage(hKbd,WM_SYSCOMMAND, SC_CLOSE,0);    //
}

4.Administrator 無節操控制(不建議)

用最強權限控制,當然是最沒有節操的。


  目錄