Конференция "WinAPI" » Что за сообщение такое $C0E6?
 
  • dmk © (25.03.17 15:00) [0]
    Что за сообщение такое $C0E6?
  • Игорь Шевченко © (25.03.17 15:28) [1]
    Пользовательское
  • D7 (04.04.17 20:19) [2]
    >> 0xC*** is a standard way to define a custom string message.

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms644931(v=vs.85).aspx

    >> 0xC000 through 0xFFFF - String messages for use by applications.
    >> Message numbers in the fourth range (0xC000 through 0xFFFF) are defined at run time when an application calls the RegisterWindowMessage function to retrieve a message number for a string.
    >> All applications that register the same string can use the associated message number for exchanging messages.
    >> The actual message number, however, is not a constant and cannot be assumed to be the same between different sessions.
  • D7 (04.04.17 20:20) [3]
    Гораздо интереснее как Spy++ расшифровывает имена сообщений, в том числе таких...
  • dmk © (04.04.17 20:48) [4]
    В Delphi раньше WinSight вроде был, а потом убрали. А spy++ только в составе Visual C. Так что шпионов у меня нет. Может бесплатные есть?
  • Игорь Шевченко © (04.04.17 21:16) [5]
    D7   (04.04.17 20:20) [3]


    > Гораздо интереснее как Spy++ расшифровывает имена сообщений,
    >  в том числе таких...


    В том числе таких он расшифровывает очень просто, с помощью функции GetAtomName.

    dmk ©   (04.04.17 20:48) [4]

    http://mdb-blog.blogspot.ru/2017/02/download-microsoft-spy-140-2016-06-20.html
  • D7 (04.04.17 21:23) [6]
    Spy++ да, в составе, но и отдельно скачать вполне можно, сам по себе спай вроде как бесплатен. Хотя вот теперь не уверен))

    Просто спай показывает: "Окну пришло сообщение WM_PAINT" - тут как бы ещё ладно, допустим как-то так:
    If ( Msg = WM_PAINT ) Then Log.Add( ' Message Received: WM_PAINT ' );
    Но вот как он определяет имя когда сообщение пользовательское: "Окну пришло сообщение WM_MY_SUPER_USER_MESSAGE" ??
  • D7 (04.04.17 21:24) [7]
    ой... Пока писал уже ответили... Вот оно как! Спасибо огромное!
  • D7 (04.04.17 22:32) [8]
    Не-а, GetAtomName() чёта не прокатила, а зато вот эта работает: GetClipboardFormatName()
  • Игорь Шевченко © (05.04.17 10:43) [9]
    GlobalGetAtomName
  • Игорь Шевченко © (05.04.17 10:44) [10]
    program EnumAtomsSample;

    {$APPTYPE CONSOLE}

    uses
     Windows,
     SysUtils;

    function GetAtomName(nAtom: TAtom): string;
    var n: Integer;
       tmpstr: array [0..255] of Char;
    begin
     n := GlobalGetAtomName(nAtom, PChar(@tmpstr[0]), 256);
     if n = 0 then
       Result := ''
     else
       Result := tmpstr;
    end;

    procedure EnumAtoms;
    var i: Integer;
       s: string;
    begin
     for i := MAXINTATOM to MAXWORD do
       begin
         s := GetAtomName(i);
         if (s <> '') then WriteLn(s);
       end;
    end;

    begin
     try
       EnumAtoms;
     except
       on E: Exception do
         Writeln(E.ClassName, ': ', E.Message);
     end;
    end.

  • dmk © (05.04.17 18:42) [11]
  • D7 (07.04.17 18:27) [12]
    > [9]

    Не-не) Я ж проверял прежде чем писать) И этот код мне где-то Гугл выдавал даже.
    У меня в таблице три колонки, от нуля до MAXWORD:

    * GetAtomName() - всегда пустое (в процессе приложения VCL, что как по мне немного странно, глобальные-то оно создаёт, а локальные совсем нет?).
    * GlobalGetAtomName() - ожидаемо что-то выдаёт, но не то. Во всяком случае под Win7 и WinXP.
    * GetClipboardFormatName() - а вот это выдаёт имена сообщений созданных через RegisterWindowMessage().

    > Пиратка. Не дружу я с ними ;)

    У меня было две версии Студии, сейчас уже нету, но две версии Spy++ и сейчас лежат под рукою, просто как утилиты, лицензий не просят.
  • D7 (07.04.17 18:31) [13]
    У себя вот такие сообщения нашёл:
    * 'TaskbarCreated'
    * 'TaskbarButtonCreated'
    * 'WM_ATLGETHOST'
    * 'WM_ATLGETCONTROL'
    * 'WM_HTML_GETOBJECT'
    * 'WM_WINMGR'
    Местами были ещё какие-то странные, их не привожу.
  • DevX (10.04.17 15:53) [14]
    How to list custom messages (RegisterWindowMessage)?

    Eduardo A. Morcillo:

    > RegisterWindowMessage returns a value in the range &HC000 through &HFFFF.
    > I remembered other 2 functions that returns values in the same range: AddAtom, RegisterClipboardFormat,
    > and I thought that, maybe, RegisterWindowMessage uses one of them to register the message.
    > GetAtomName returns the name of an atom and GetClipboardFormatName returns the name of the clipboard format.
    > So I just test them. GetAtomName failed, but GetClipboardFormatName returned the correct name.
  • Игорь Шевченко © (10.04.17 17:24) [15]
    https://groups.google.com/forum/#!topic/microsoft.public.vc.mfc/-D98EsgOSto

    "For example, registered clipboard formats are stored in an internal atom
    table used by the system. An application adds atoms to this atom table using
    the RegisterClipboardFormat function."
    So this table is not accessible through GlobalGetAtomNAme. But it happens to
    be shared with registered messages.

    Actually, it seems that RegisterWindowMessage and RegisterClipboardFormat
    are the *same* function, or point to the same entry in user32.dll.

    Maybe all this is undocumented behavior that cannot be relied up for future
    version of Windows...
 
Конференция "WinAPI" » Что за сообщение такое $C0E6?
Есть новые Нет новых   [118487   +56][b:0][p:0.001]