2013-12-15 14 views
16

私はこのような今年のために自分のアプリケーションに個人的なメッセージを使用していたんだ。プライベートベースのアプリケーションメッセージを定義する方法は?

UM_APP_BASE = WM_APP; // WM_APP is declared as WM_APP = $8000; in "Controls" unit. 

、その後、私の個人的なメッセージに定義:

UM_EXPLORER_MSG = UM_APP_BASE + 1; 
UM_LICENSE_CHANGE_MSG = UM_APP_BASE + 2; 
etc... 

そして、私のクラスでは、このようにそれらを使用します。

procedure UMLicenseChanged(var Message: TMessage); message UM_LICENSE_CHANGE_MSG; 

(私はRegisterWindowMessageを使用して他のアプリケーションと「話す」が異なる話です)

最初にWM_USERの代わりにWM_APPを使用するように決めた理由を覚えていません。
ドキュメントは言う:

WM_USER定数はメッセージを区別するために使用されたプライベートウィンドウクラス内でメッセージを送信するために アプリケーションで使用でき、Windowsおよび値で使用するために予約されている 値。

Range Meaning 
0 through WM_USER - 1 Messages reserved for use by Windows. 
WM_USER through 0x7FFF Integer messages for use by private window classes. 
0x8000 through 0xBFFF Messages reserved for future use by Windows. 
0xC000 through 0xFFFF String messages for use by applications. 
Greater than 0xFFFF Reserved by Windows for future use. 

WM_APPは、「Windowsが将来の使用のために予約」されていることを意味します。メッセージ番号の 5範囲があります。 一方、デルファイはその範囲にあるCM_BASE = $B000;を使用しています。またCN_BASE = $BC00;

Windows/Delphi/Otherコントロールの両方で使用される他のメッセージと重複しないように基本メッセージを定義するにはどうすればよいですか? 私のアプリケーションのプライベートとして優先されるベースメッセージはどれですか?なぜ?
WM_APPの代わりにWM_USERを使用しますか? WM_USERベースはCommCtrlでもWindowsによって使用されます。 TB_ENABLEBUTTON = WM_USER + 1。 ...

この問題についていくつかの洞察が必要です。


私はこれを私のDelphiヘルプAPI(D5)で読んでいます。これは明らかに時代遅れです!
これはおそらく私がWM_APPを使用することを決めた理由です。
まだ、2つの違いについての説明はいいでしょう:)

+1

['WM_APP'](http://msdn.microsoft.com/en-us/library/ms644930%28v=vs.85%29.aspx)または[' WM_USER']のドキュメントを読んでいる可能性があります(http://msdn.microsoft.com/en-us/library/ms644931%28v=vs.85%29.aspx)、 "WM_APP(0x8000)〜0xBFFF - アプリケーションが使用できるメッセージ* " –

+0

どのようなドキュメントを参照していますか? –

+0

@SertacAkyuz、今私はなぜdownvotes ...私は私のDelphiのヘルプファイル(D5)でこれを読んで理解する。これは明らかに時代遅れです!それでも正しい選択をしたとしても。"アプリケーションで使用可能なメッセージ*"と "*プライベートウィンドウクラス*で使用する整数メッセージ"の違いを完全に理解することはできません – kobik

答えて

16

あなたの情報がどこから来ているのか分かりません。 MSDN documentationは言う:

0 WM_USER -1システムで使用するために予約
メッセージを介して。

WM_USERから0x7FFF
プライベートウィンドウクラスで使用する整数メッセージ。

WM_APP(0x8000)から0xBFFF
メッセージは、アプリケーションで使用可能です。

0xC000から0xFFFF
アプリケーションで使用する文字列メッセージ。

0xFFFFより大きい
システムによって予約済みです。今


WM_USER範囲の違い、およびWM_APP範囲は何ですか?これは多くの場所でカバーされています。たとえば、here is what Raymond Chen has to sayです。

0x400 .. 0x7FFF(WM_USER .. WM_APP-1):クラス定義のメッセージ。

これらのメッセージの意味は、ウィンドウクラス の実装者によって決定されます。 (非公式に、ウィンドウクラスのRegisterClassを のために呼び出す人)。たとえば、WM_USER + 1メッセージは、ウィンドウがツールバーコントロールの場合は TB_ENABLEBUTTONを意味しますが、ツールチップコントロールの場合は を意味し、 DM_SETDEFIDの場合 ダイアログボックスです。独自のコントロールを作成した場合は、 は完全に異なるものです。誰でもこの範囲の メッセージを作成できるため、オペレーティングシステムはパラメータが意味するものがわからず、自動マーシャリングを実行できません。

0x8000 .. 0xBFFF(WM_APP ... MAXINTATOM-1):アプリケーション定義のメッセージ。

これらのメッセージの意味は、 がウィンドウを作成したアプリケーションによって決まります。このメッセージ領域は、 を確実にするために、ウィンドウをサブクラス化してカスタムメッセージ を生成するアプリケーションが、 将来のバージョンのウィンドウクラスによって作成された新しいメッセージを妨げないようにするためにWindows 95で作成されました( CreateWindowを呼び出します)。この の範囲に誰かがメッセージを作成できるため、オペレーティングシステムはパラメータの意味を理解せず、 は自動マーシャリングを実行できません。このすべてから取る

主なものは、あなたがWM_USER範囲内のメッセージを定義する場合は、それらの同じメッセージのために独自の用途を持っているあなたのアプリケーション内の他のコントロールのために調製されることがあります。たとえば、WM_USERの範囲のメッセージをブロードキャストしないでください。

一方、WM_APPの範囲内のメッセージは、アプリケーション内のすべての異なるウィンドウクラスに対して同じ意味を持つことを意図しています。

関連する問題