none
SetWindowLongのWS_EX_NOACTIVATE挙動がWindows7とWindows10とで違う RRS feed

  • 質問

  • VisualStudio2015にて、コンソールウィンドウを
    CreateWindow→ SetWindowLong → SetWindowPos → ShowWindow
    Windows表示させるとします。(ざくっとした言い方ですみません)

    SetWindowLong
      にて
    SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_NOACTIVATE)
    WS_EX_NOACTIVATE にしてコンソールウィンドウ内の文字列を、
    マウスでテキスト選択処理できないように設定しておりました。

    この
    WS_EX_NOACTIVATE にて、Windows7ではアクティブにならずに、
    ちゃんとマウスで表示文字選択できないように設定できるのです。

    しかし、Windows10 では、期待した挙動にならず、マウスでテキスト選択できてしまうのです。

    英文等の記事などきちんと下調べできていなくて申し訳ありませんが、
    なにか、Windows10からは仕様が変わったとか、違う関数を使用するようになったとか
    何かご存知なことありませんか。

    ちなみに、
    SetWindowLongPtr を使用するという情報を得て試しておりましたが、
    状況は変わりませんでした。
    第三引数をLONG_PTR使用に変更して、
    WS_EX_NOACTIVATE
    実数渡し、ポインタ渡し両方試しました。どちらも、マウスでテキスト選択できてしまいます。

    2019年6月25日 2:09

回答

  • WS_EX_NOACTIVATEはトップレベルのウィンドウをクリックしたときに自動的にウィンドウをアクティブにしない為のフラグで、マウスメッセージを送らないというフラグではありません。なのでWM_LBUTTONDOWN、WM_LBUTTONUPやWM_MOUSEMOVEなどのメッセージはウィンドウに送られます。それをどう処理するかはアプリケーションに任されています。Win7とWin10でコンソールウィンドウの挙動が変わったということは内部の仕様が変わったということだと思います。マウスメッセージを処理させたくないのでしたら、EnableWindow等でウィンドウを無効に設定するのはいかがでしょうか。
    • 編集済み kenjinoteMVP 2019年6月25日 3:24
    • 回答としてマーク mfujikawa 2019年6月25日 6:44
    2019年6月25日 2:38

すべての返信

  • WS_EX_NOACTIVATEはトップレベルのウィンドウをクリックしたときに自動的にウィンドウをアクティブにしない為のフラグで、マウスメッセージを送らないというフラグではありません。なのでWM_LBUTTONDOWN、WM_LBUTTONUPやWM_MOUSEMOVEなどのメッセージはウィンドウに送られます。それをどう処理するかはアプリケーションに任されています。Win7とWin10でコンソールウィンドウの挙動が変わったということは内部の仕様が変わったということだと思います。マウスメッセージを処理させたくないのでしたら、EnableWindow等でウィンドウを無効に設定するのはいかがでしょうか。
    • 編集済み kenjinoteMVP 2019年6月25日 3:24
    • 回答としてマーク mfujikawa 2019年6月25日 6:44
    2019年6月25日 2:38
  • 返信ありがとうございます。
    Windowsプログラミング暦浅く、
    見当違いの質問のようで申し訳ありません。

    同じ実行ファイルがWIn7とWin10で動作が異なり
    Win10でテキスト選択繰り返すと、
    そのうちハングアップするという事態が発生し困っておりました。

    EnableWindowですね。
    アドバイスありがとうございます。確認します。

    kenjinote様
    願っていた挙動になりました。
    ありがとうございました。


    • 編集済み mfujikawa 2019年6月25日 6:44
    2019年6月25日 3:09