Programming a Software-Based Input Panel (Windows CE 5.0)
When the user accesses the software-based input panel, Windows CE creates a dedicated software-based input panel thread. The thread creates a software-based input panel window and initializes the software-based input panel. Then, the thread enters a message loop. Within the message loop, the thread responds to messages and user interface (UI) requests from the software-based input panel window. The thread also calls into the IM object, enabling the IM to create child windows in the software-based input panel window. The content of the software-based input panel window is determined by the current IM.
The software-based input panel thread has a special status with the OS. Any window that the software-based input panel thread creates will not be obscured by other windows. Because some UI elements save and clear themselves when they lose focus, the software-based input panel and its child windows do not receive the focus, even if the user currently is using the software-based input panel.
The software-based input panel queries the IM for data through the IInputMethod and IInputMethod2 interfaces. The software-based input panel can remove the current IM and replace it with a new IM. The following table shows the methods of the IInputMethod and IInputMethod2 interfaces.
Method | Description |
---|---|
IInputMethod::Deselect | Destroys its window and performs IM-specific cleanup procedures. |
IInputMethod::GetImData | Sends data from the current input method (IM) to the current application. |
IInputMethod::GetInfo | Requests data regarding the new IM, including property flags and the preferred IM size. |
IInputMethod::Hiding | Performs any saving routines before the software-based input panel is hidden. |
IInputMethod::ReceiveSipInfo | Sends the IM data about the size, placement, and docked status that the IM should use. |
IInputMethod::RegisterCallback | Provides the IM with a pointer to the IIMCallback interface. |
IInputMethod::Select | Creates the IM window and image list. |
IInputMethod::SetImData | Responds to a request from an application to set IM-specific data within the IM. |
IInputMethod::Showing | Performs any initialization before the software-based input panel window is displayed. |
IInputMethod::UserOptionsDlg | Presents an IM-specific options dialog box. |
IInputMethod2::Deselect | Destroys its window and performs IM-specific cleanup procedures. |
IInputMethod2::GetImData | Sends data from the current IM to the current application. |
IInputMethod2::GetInfo | Requests data regarding the new IM, including property flags and the preferred IM size. |
IInputMethod2::Hiding | Performs any saving routines before the software-based input panel is hidden. |
IInputMethod2::ReceiveSipInfo | Sends the IM data about the size, placement, and docked status that the IM should use. |
IInputMethod2::RegisterCallback | Provides the IM with a pointer to the IIMCallback interface. |
IInputMethod2::RegisterCallback2 | Provides the IM with a pointer to the IIMCallback2 interface. |
IInputMethod2::Select | Creates the IM window and image list. |
IInputMethod2::SetImData | Responds to a request from an application to set IM-specific data within the IM. |
IInputMethod2::SetIMMActiveContext | Receives the current state of the IME. |
IInputMethod2::Showing | Performs any initialization before the software-based input panel window is displayed. |
IInputMethod2::UserOptionsDlg | Presents an IM-specific options dialog box. |
After the software-based input panel calls these methods, the IM should render the software-based input panel window space and respond to user actions. For more information about programming the IM, see Programming Input Methods.
An application that uses the software-based input panel should know the state of the software-based input panel — whether the panel is visible, whether it is docked, or floating, and its size and position. All of this data is stored in the SIPINFO structure, which is accessed through the SipGetInfo and SipSetInfo functions. The following code example shows how to use the SipGetInfo and SipSetInfo functions to access and modify the SIPINFO structure.
BOOL LowerSip( void )
{
BOOL fRes = FALSE;
SIPINFO si;
memset (&si, 0, sizeof (si));
si.cbSize = sizeof (si);
if (SipGetInfo(&si))
{
si.fdwFlags &= ~SIPF_ON;
fRes = SipSetInfo(&si);
}
return fRes;
}
When the user changes the state of the software-based input panel, the OS sends out a WM_SETTINGCHANGE message to all of the active applications. This wParam parameter of this message is the value SPI_SETSIPINFO in its wParam parameter. The following code example shows how you can use the SipGetInfo function to move the software-based input panel on the screen in response to a WM_SETTINGCHANGE message.
WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
SIPINFO si;
switch (msg)
{
case WM_SETTINGCHANGE:
switch (wParam)
{
case SPI_SETSIPINFO:
memset (&si, 0, sizeof (si));
si.cbSize = sizeof (si);
if (SipGetInfo(&si))
{
MoveWindow (
hwnd,
si.rcVisibleDesktop.left,
si.rcVisibleDesktop.top,
si.rcVisibleDesktop.right - si.rcVisibleDesktop.left,
si.rcVisibleDesktop.bottom - si.rcVisibleDesktop.top,
TRUE);
}
break;
}
break;
}
return 0;
}
A change in the active IM sends messages to all of the top-level applications that are registered to receive IM notifications. Typically, the messages go to an application that controls a display, such as a taskbar. The following table shows the messages.
Event | Windows CE message | Application action |
---|---|---|
Size or position of IM changes | WM_IM_INFO | Return 0 if the application processes the message. |
IM has a new icon to associate with its current state | WM_IM_INFO | Return 0 if the application processes the message. |
See Also
Software-Based Input Panel Application Development | Software-based Input Panel
Send Feedback on this topic to the authors