2011年6月29日

枠に囚われたくない、でも枠が表示されない

最近困ること、それはWindows7でのみ発生する現象について客から聞かれること

だっておいらのPCまだXPだもんヽ(`Д´)ノ
そして最近あったものはこんなご連絡

客「なんかさ~表示がなんだけど~」
貧「え~っと、どのように変なんでしょうか?」
客「うん、なんていうの?今までと違うの」
貧「はい、それでどこが違っているのでしょうか?」
客「いや~どこがって言われてもね~、古いパソコンもうないし」
(グダグダと10分ほどカチカチクリック音が鳴り響く)
貧「あの、では違和感を感じる部分だけでも教えていただけないでしょうか?」
客「あ~、この辺かな~(電話越し)」
貧「はい、どのような感じでしょうか」
客「感じって言われても。なんか違和感・・・」
貧「今からお伝えする通りにキーボード操作してください。その画面をメールに添付できるようにしますので」

と。PC分かっている人になら
キャプチャ撮ってメールで送って
5秒で済む話を15分ほど続けられ、
送られてきた現象を要約するとこんな感じ

現象
Windows7(Vista)でチェックボックスに点線(破線)の枠が表示されない

・・・20行ほどの無駄な前振りについてはここで謝ります。
m(_ _)m


さて、この現象ですが、
ざっと調べてみると、WindowsVista/7で発生する
Microsoft的に「仕様」な現象みたい
仕様ですか、なら仕方ないですね。チャンチャン♪

ま、こんな感じ↓
(7を使っている人が帰るのを待って検証した結果)

が、ただまあ、何とかしないといけないわけで
対処法をいろいろ試しました。
参考:VistaでComboBoxにフォーカスを移すためにSetFocusするとコンボの見た目が変わらない。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43887&forum=7

で、C#上で何とかするには以下のロジックをどこでもいいので実行すれば良いみたい

ロジック:
Windows7やVistaでチェックボックスやコンボボックスの枠線が初期表示されない現象をC#で対応する

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SystemParametersInfo(UInt32 uiAction, UInt32 uiParam, bool pvParam, UInt32 fWinIni);

const uint SPI_SETKEYBOARDCUES = 0x100B;
const uint SPIF_UPDATEINIFILE = 0x0001;
const uint SPIF_SENDWININICHANGE = 0x0002;

int Result = SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, true, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);

一番手っ取り早いのは
public partial class Form1 : Form
{
の直後でしょうか

Administrator権限を持っていてUACの制御がちゃんと行えていれば
再起動してもそのまま枠線が表示されるみたいです

単純に
SystemParametersInfoをCALLして
SPI_SETKEYBOARDCUESの制御をお願いしているだけですが・・・

ちゃんと↓の用に枠線が見えるようになりました
(使いたい時に限って遅くまで仕事してるもんだからおいらは終電ギリまで以下略)