在论坛上看到了一个X11实例。我想在windows时下制作一个屏幕键盘,对于在windows下该怎么发送消息不是很了解,看了网上的一些段源码,发送消息都是向自己的父窗口发送,要怎样才能将自定义的键盘事件通知给系统呢。
网上摘下的一段代码如下:
void WidgetKeyboard::on_btn_clicked(int btn)
{
if(! soundFilePath.isEmpty())
QSound::play(soundFilePath);
QString strKeyId;
strKeyId = allButtons.at(btn)->accessibleName();
bool isOk;
int keyId = strKeyId.toInt(&isOk, 16);
if (strKeyId.isEmpty() || !isOk) {
QMessageBox::information(0,0,"Key Not Found");
return;
}
//Keys to be handled separately
if (keyId==Qt::Key_Shift
|| keyId==Qt::Key_Control
|| keyId==Qt::Key_Alt
|| keyId==Qt::Key_Print
)
return;
int involvedKeys = 1;
Qt::KeyboardModifiers Modifier = Qt::NoModifier;
if (isCtrl) {
Modifier = Modifier | Qt::ControlModifier;
involvedKeys++;
}
if (isShift) {
Modifier = Modifier | Qt::ShiftModifier;
involvedKeys++;
}
if (isAlt) {
Modifier = Modifier | Qt::AltModifier;
involvedKeys++;
}
bool isTextKey = false;
if(keyId==Qt::Key_Insert && !isShift)
return;
QString ch = allButtons.at(btn)->text().trimmed();
if (ch=="&&")
ch="&";
else if (keyId==Qt::Key_Space)
ch = " ";
else if (checkNotTextKey(keyId))
ch = QString();
else
isTextKey = true;
if(isIns && isTextKey) {
QKeyEvent keyEventIns(QEvent::KeyPress, Qt::Key_Delete, Qt::NoModifier);
QApplication::sendEvent(m_pParent->focusWidget(), &keyEventIns);
}
QKeyEvent keyEvent(QEvent::KeyPress, keyId, Modifier, ch, false, involvedKeys);
QApplication::sendEvent(QApplication::focusWidget(), &keyEvent);
btnShiftLeft->setChecked(false);
btnShiftRight->setChecked(false);
btnCtrlLeft->setChecked(false);
btnAltLeft->setChecked(false);
}