環境
- 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 無節操控制(不建議)
用最強權限控制,當然是最沒有節操的。