To prevent undesirable information from being passed to SipSetInfo, clear the SIPINFO structure beforehand.
The following code example shows how to clear the structure.
memset(pSipInfo, 0, sizeof(SIPINFO))
"undesirable information"というのが引っかかったので、空のSIPINFOをSipSetInfo()に渡してSipSetCurrentIM()の前後で実行してみたのですが何も変わりませんでした。
ところが、ふとSIPINFOの定義を見てみると おなじみのcbSizeメンバがあるじゃないですか。 cbSizeをセットしてやると SIPを切り替えても表示が崩れなくなりました。
たまたま動いているだけかもしれませんが、昨日のSIP切り替え部分はこんな感じになりました。
static VOID ChgSip() { DWORD dwData = 0L; SIPINFO sipInfo = {0}; if (SUCCEEDED(RegistryGetDWORD(SN_DISPLAYROTATION_ROOT, SN_DISPLAYROTATION_PATH, SN_DISPLAYROTATION_VALUE, &dwData))) { ZeroMemory(&sipInfo, sizeof(SIPINFO)); sipInfo.cbSize = sizeof(SIPINFO); SipSetInfo(&sipInfo); if (0L == dwData) { SipSetCurrentIM(&g_clsidPortrait); } else { SipSetCurrentIM(&g_clsidLandscape); } } }「cbSizeがあったらセットする」というのは常識なのかもしれませんが、せっかくサンプル書くならそこまで書いておいて欲しいですよね。
という訳で、一応動いているプログラムを公開しておきます。

あとは画面の向きが切り替わったときに自動的にプログラムが起動してSIPを切り替えます。
やっている事は既存ツールの組み合わせで実現できる上に、PQzIIなら普通に備わっている機能なので あくまで参考程度という事で...。