如何通过按钮打开windows的软键盘?

tigerwoods81 2005-10-21 04:31:57
我想通过按钮,能打开windows的软键盘,不知道怎么实现?我在网上找到过vc实现的,不知道bcb如何实现?
希望大家帮助!
...全文
1369 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
XBox360 2005-10-24
  • 打赏
  • 举报
回复
system("osk"); 行不行?
tigerwoods81 2005-10-24
  • 打赏
  • 举报
回复
谢谢大家帮助,我已经解决拉!
weill 2005-10-23
  • 打赏
  • 举报
回复
以上VC代码利用的是IME式的输入法的基础之上的,纯E文输入是不依靠输入法的。
也就是说,输入组件中它吖就没那玩意儿,你上哪调去啊,呵呵。

怎么办呢?
方法一:自个写软键盘。
方法二:使用系统自带osk.exe。
方法三:把osk.exe打包到你的程序中,去调(这玩就保证没问题啦,哈哈)。

就不知道这个osk.exe是不是纯绿软件哦,呵呵。
据我所知,泡泡堂等玩的软键盘就是自个写的,这玩最可靠了。
别的方法应该没了。

对于代码的解释,实在不必了吧,就那几行,猜也猜个八九不离十了。
实在不懂,你去网上查一下那几个函数就明白了。
ccrun.com 2005-10-22
  • 打赏
  • 举报
回复
就那么几句代码,不用解释什么了吧。呵呵。
tigerwoods81 2005-10-22
  • 打赏
  • 举报
回复
呵呵,谢谢 weill(每天提一问,一天学一点),你真是热心呀,我又试了一下,确实没问题拉,不过切换输入法到英文时,软键盘会关闭,那我怎么输入英文,这还是不行,我中英文都要输入呀,最后能不能帮我解释一下这段代码每句是什么意思?
flowercity 2005-10-22
  • 打赏
  • 举报
回复
up
weill 2005-10-22
  • 打赏
  • 举报
回复
就你给出的VC代码来说,只能实现先打开输入法后,再打开软键盘的功能。

也就是说,这段VC代码及我给你的BCB的代码都是建立在IME式的输入法的基础之上的。

能够打开你的软键盘,也能关闭(请试我后来给你的那段程序)。

本人在win2k3下测试通过,应该没有问题。

此外,给你一个偏方:
使用DOS命令运行:osk.exe,呵呵。(XP/win2k/win2003下有效)

tigerwoods81 2005-10-21
  • 打赏
  • 举报
回复
谢谢楼上的帮助!我在2000下试了,果然可以打开,不过好象不能关闭,而且要开中文输入吧,不知能不能改进一下呀!
其实还想在2000和xp下实现,不过xp下不能打开软键盘.不知怎么回事!
weill 2005-10-21
  • 打赏
  • 举报
回复
嗯好了,原来是偶的扩号打错地方了,呵呵。

原来那一小段不是查输入法打开没。
输入法不打开,输键盘是不管怎么样调不出的。

嗯,有点意儿,代码修正如下:

HIMC hIMC = ImmGetContext(Form1->Handle);
DWORD dwConv, dwSent;
DWORD dwTemp;

ImmGetConversionStatus(hIMC,&dwConv,&dwSent);
if (dwConv & IME_CMODE_SOFTKBD){
dwConv &= ~IME_CMODE_SOFTKBD;
}else{
dwConv |= IME_CMODE_SOFTKBD;
};
ImmSetConversionStatus(hIMC,dwConv,dwSent);
ImmReleaseContext(Form1->Handle,hIMC);
weill 2005-10-21
  • 打赏
  • 举报
回复
麻烦来了……打得开,关不了,和和,不会非得手动关吧,偶再试试。
weill 2005-10-21
  • 打赏
  • 举报
回复
改编自VC代码。
因为对楼主的问题好奇就试了试,本人还没有完全看懂。
不过在win2003下调试成功,哈哈。
下面的代码中防止了你没打开中文输入法就开软键盘(你硬要那样的结果是什么我还没试,呵呵)。
注意,主窗体为Form1(默认)。

HIMC hIMC = ImmGetContext(Form1->Handle);//如果不是默认Form1
//请修改这儿的主窗体名。
DWORD dwConv, dwSent;
DWORD dwTemp;

ImmGetConversionStatus(hIMC,&dwConv,&dwSent);
if (dwConv & IME_CMODE_SOFTKBD)
dwConv &= ~IME_CMODE_SOFTKBD;
else{
dwConv |= IME_CMODE_SOFTKBD;

ImmSetConversionStatus(hIMC,dwConv,dwSent);

ImmReleaseContext(Form1->Handle,hIMC);//如果不是默认Form1
//请修改这儿的主窗体名。


}
tigerwoods81 2005-10-21
  • 打赏
  • 举报
回复
下面是vc实现的
void CHideDlgDlg::OnButton10()
{
// TODO: Add your control notification handler code here
CWnd * pWnd = GetDlgItem(IDC_TREE1);
if (pWnd){
pWnd->SetFocus();

HIMC hIMC = ImmGetContext(pWnd->m_hWnd);
DWORD dwConv, dwSent;
DWORD dwTemp;

ImmGetConversionStatus(hIMC,&dwConv,&dwSent);
if (dwConv & IME_CMODE_SOFTKBD)
dwConv &= ~IME_CMODE_SOFTKBD;
else
dwConv |= IME_CMODE_SOFTKBD;

ImmSetConversionStatus(hIMC,dwConv,dwSent);

ImmReleaseContext(pWnd->m_hWnd,hIMC);
}
}

实际上好像vc有更简单的方法,
MSDN的解决方案是用:
SHSipPreference(hWnd, SIP_UP);
SHSipPreference(hWnd, SIP_DOWN);

我从来没有用过vc,也不知对不对?用bcb怎么实现呀?
Waiting4you 2005-10-21
  • 打赏
  • 举报
回复
把VC实现的拿出来瞧瞧再说嘛

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧