ページ 11

エディットで自動ポップアップを無効化したい

Posted: 2012年11月14日(水) 18:00
by オカピーα
こんにちは。毎回お世話になっております。
今回メモ帳風なソフトウェアをつくっているのですが
エディットを右クリックしたときに出るデフォルトで実装されているポップアップが鬱陶しいです。
出ないように(というか自作のポップアップ)したいのですが、良い方法が見つかりません。
リッチエディットは「ES_NOIME」というのがあるのですが普通のエディットには見つかりませんでした。
どなたかご教授ください

Re: エディットで自動ポップアップを無効化したい

Posted: 2012年11月14日(水) 22:50
by softya(ソフト屋)
Spy++でメッセージを調べてみてはどうでしょうか?
「Spy++ の概要」
http://msdn.microsoft.com/ja-jp/library ... 60756.aspx

Re: エディットで自動ポップアップを無効化したい

Posted: 2012年11月14日(水) 23:33
by ISLe
確かサブクラス化してWM_CONTEXTMENUを横取りしたらできたかと思います(未確認)。

Re: エディットで自動ポップアップを無効化したい

Posted: 2012年11月15日(木) 07:37
by オカピーα
WM_CONTEXTMENUを捕まえてbreakしてみましたが無理でした・・・
さらにサブクラス化したところでなんとWM_RBOTTONDOWNメッセージが来ません!
(つまり右クリックが受け取れない)
どうしたらいいでしょう・・・

Re: エディットで自動ポップアップを無効化したい

Posted: 2012年11月15日(木) 12:12
by softya(ソフト屋)
サブクラス化してWM_CONTEXTMENUを捕まえる話は何処へいったのでしょうか?

Re: エディットで自動ポップアップを無効化したい

Posted: 2012年11月15日(木) 13:26
by YuO
サブクラス化でコンテキストメニューの抑止はできますが……。

面倒なんでテストコードをそのまま (VS2010 in Win8pro)。

コード:

#include	<Windows.h>
#include	<CommCtrl.h>
#pragma comment(lib, "comctl32")

LRESULT CALLBACK EditSubClassedProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    if (uMsg == WM_CONTEXTMENU)
    {
        return 0;
    }
    if (uMsg == WM_DESTROY)
    {
        PostQuitMessage(0);
    }
    DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
    HWND hWnd = CreateWindow(TEXT("EDIT"), TEXT("Test"), WS_OVERLAPPEDWINDOW | ES_MULTILINE,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, nullptr, 0);
    if (hWnd == nullptr)
    {
        return GetLastError();
    }

    if (!SetWindowSubclass(hWnd, EditSubClassedProc, 1, 0))
    {
        return GetLastError();
    }

    ShowWindow(hWnd, SW_SHOW);

    MSG msg;
    BOOL result;
    while ((result = GetMessage(&msg, nullptr, 0, 0)) != 0 && result != -1)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    if (result == -1)
    {
        return GetLastError();
    }
    return msg.wParam;
}

Re: エディットで自動ポップアップを無効化したい

Posted: 2012年11月15日(木) 16:30
by オカピーα
自力で解決できました!
解決方法としては、WM_RBOTTOMDOWNを受け取ってTrackPopupメニューを表示し、
return 0する方法です。
WM_RBOTTOMDOWNがこなかったのは「R」と「L」を間違えていたようです。
WM_CONTEXTMENUも検討しましたがWM_RBOTTOMDOWNは補助項目にマウス座標が入っていてやりやすいので
後者にします。
お答えしてくださった皆様ありがとうございました!

Re: エディットで自動ポップアップを無効化したい

Posted: 2012年11月15日(木) 18:03
by ISLe
WM_CONTEXTMENUでもマウス座標を取れますけどね。

マウスの右クリック以外でもコンテキストメニューを開くことはできるのですが、そのときWM_RBUTTONDOWNイベントは発生しましたっけ。

ウィンドウズがコンテキストメニューを表示する(WM_CONTEXTMENUを発生させる)タイミングはWM_RBUTTONUPのあとです。
変わる可能性が無いとも言えないので、専用イベントがあるものはそちらを使ったほうが良いですよ。
ウィンドウズの使い勝手なんて無視して独自のポリシーを貫きたいのかもしれませんが、わざわざ茨の道を進むこともないと思います。

Re: エディットで自動ポップアップを無効化したい

Posted: 2012年11月27日(火) 16:54
by オカピーα
返信ありがとうございます。
WM_CONTEXTMENUも検討してみることにします^^