Why doesn't this work (sendmessage)

  • Follow


Hi,

Is there a reason why I can't send and receive a messages with a
negative number using SendMessage?

The Windows common controls use negative notification messages and
I've never had a problem receiving those, so the problem has to be
with the Sending side of things.

What am I missing?

Thanks


'**** FORM1 ****'
Option Explicit

Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA"
( _
  ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any
_
) As Long

Private Declare Function SetWindowSubclass Lib "comctl32" ( _
  ByVal hWnd As Long, ByVal pfnSubclass As Long, _
  ByVal uIdSubclass As Long, ByVal dwRefData As Long _
) As Long

Private Declare Function DefSubclassProc Lib "comctl32" ( _
  ByVal hWnd As Long, ByVal wMsg As Long, _
  ByVal wParam As Long, ByVal lParam As Long _
) As Long

Private Declare Function RemoveWindowSubclass Lib "comctl32" ( _
  ByVal hWnd As Long, ByVal pfnSubclass As Long, _
  ByVal uIdSubclass As Long _
) As Long

Friend Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, _
  ByVal wParam As Long, ByVal lParam As Long) As Long
  
  Select Case uMsg
    Case -2049
      Debug.Print "-2049"
    Case Else
      WndProc = DefSubclassProc(hWnd, uMsg, wParam, lParam)
  End Select
End Function

Private Sub Form_Load()
  Call SetWindowSubclass(Me.hWnd, AddressOf Module1.WndProc,
ObjPtr(Me), 0&)
  Call SendMessage(Me.hWnd, -2049, ByVal 0&, ByVal 0&)
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Call RemoveWindowSubclass(Me.hWnd, AddressOf Module1.WndProc, _
ObjPtr(Me))
End Sub

'**** MODULE1 ****'
Option Explicit

Public Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, _
  ByVal wParam As Long, ByVal lParam As Long, _
  ByVal uIdSubclass As Form1, ByVal dwRefData As Long _
) As Long
   
  WndProc = uIdSubclass.WndProc(hWnd, uMsg, wParam, lParam)
End Function
0
Reply Robert 8/29/2010 3:51:14 PM

"Robert" <noname@noserver.com> wrote in message 
news:anuk769doofbdtd04tnohui1oi3q6agci7@4ax.com...
>  Call SendMessage(Me.hWnd, -2049, ByVal 0&, ByVal 0&)

What is the constant for -2049? I already looked at the common controls 
constants, but couldn't find a corresponding constant. Here are the list of 
notification constants:


//====== WM_NOTIFY codes (NMHDR.code values) 
==================================

#define NM_FIRST                (0U-  0U)       // generic to all controls
#define NM_LAST                 (0U- 99U)

#define LVN_FIRST               (0U-100U)       // listview
#define LVN_LAST                (0U-199U)

// Property sheet reserved      (0U-200U) -  (0U-299U) - see prsht.h

#define HDN_FIRST               (0U-300U)       // header
#define HDN_LAST                (0U-399U)

#define TVN_FIRST               (0U-400U)       // treeview
#define TVN_LAST                (0U-499U)

#define TTN_FIRST               (0U-520U)       // tooltips
#define TTN_LAST                (0U-549U)

#define TCN_FIRST               (0U-550U)       // tab control
#define TCN_LAST                (0U-580U)

// Shell reserved               (0U-580U) -  (0U-589U)

#define CDN_FIRST               (0U-601U)       // common dialog (new)
#define CDN_LAST                (0U-699U)

#define TBN_FIRST               (0U-700U)       // toolbar
#define TBN_LAST                (0U-720U)

#define UDN_FIRST               (0U-721)        // updown
#define UDN_LAST                (0U-740)
#if (_WIN32_IE >= 0x0300)
#define MCN_FIRST               (0U-750U)       // monthcal
#define MCN_LAST                (0U-759U)

#define DTN_FIRST               (0U-760U)       // datetimepick
#define DTN_LAST                (0U-799U)

#define CBEN_FIRST              (0U-800U)       // combo box ex
#define CBEN_LAST               (0U-830U)

#define RBN_FIRST               (0U-831U)       // rebar
#define RBN_LAST                (0U-859U)
#endif

#if (_WIN32_IE >= 0x0400)
#define IPN_FIRST               (0U-860U)       // internet address
#define IPN_LAST                (0U-879U)       // internet address

#define SBN_FIRST               (0U-880U)       // status bar
#define SBN_LAST                (0U-899U)

#define PGN_FIRST               (0U-900U)       // Pager Control
#define PGN_LAST                (0U-950U)

#endif

#if (_WIN32_IE >= 0x0500)
#ifndef WMN_FIRST
#define WMN_FIRST               (0U-1000U)
#define WMN_LAST                (0U-1200U)
#endif
#endif

#if (_WIN32_WINNT >= 0x0501)
#define BCN_FIRST               (0U-1250U)
#define BCN_LAST                (0U-1350U)
#endif


0
Reply Nobody 8/29/2010 4:21:20 PM


on 8/29/2010, Robert supposed :
> Hi,
>
> Is there a reason why I can't send and receive a messages with a
> negative number using SendMessage?
>
> The Windows common controls use negative notification messages and
> I've never had a problem receiving those, so the problem has to be
> with the Sending side of things.
>

I think you may have a problem with sign.  Windows Messages are 
unsigned values - some of them look negative to VB.CLASSIC, because it 
does not support an unsigned type.  What windows is seeing is going to 
be:

Dim b As Long
b = CLng("&H" & Hex$(-2049))

Which is the value: 63487

Which is &HF7FF  and in fact, when that hex value is assigned to a vb 
long, you get 63487.

So, my guess is that the value you are receiving is 63487, since that 
is under the value of 65536.

-- 
Tom Shelton


0
Reply Tom 8/29/2010 4:46:45 PM

"Tom Shelton" <tom_shelton@comcast.invalid> wrote in message 
news:i5e2v6$m5p$1@news.eternal-september.org...
> on 8/29/2010, Robert supposed :
>> Hi,
>>
>> Is there a reason why I can't send and receive a messages with a
>> negative number using SendMessage?
>>
>> The Windows common controls use negative notification messages and
>> I've never had a problem receiving those, so the problem has to be
>> with the Sending side of things.
>>
>
> I think you may have a problem with sign.  Windows Messages are unsigned 
> values - some of them look negative to VB.CLASSIC, because it does not 
> support an unsigned type.  What windows is seeing is going to be:
>
> Dim b As Long
> b = CLng("&H" & Hex$(-2049))
>
> Which is the value: 63487
>
> Which is &HF7FF  and in fact, when that hex value is assigned to a vb 
> long, you get 63487.
>
> So, my guess is that the value you are receiving is 63487, since that is 
> under the value of 65536.

Incorrect. The parameter is As Long, so -2049 gets sign extended to 32-Bit, 
and would be &HFFFFF7FF.


0
Reply Nobody 8/29/2010 5:32:19 PM

Nobody was thinking very hard :
> "Tom Shelton" <tom_shelton@comcast.invalid> wrote in message 
> news:i5e2v6$m5p$1@news.eternal-september.org...
>> on 8/29/2010, Robert supposed :
>>> Hi,
>>>
>>> Is there a reason why I can't send and receive a messages with a
>>> negative number using SendMessage?
>>>
>>> The Windows common controls use negative notification messages and
>>> I've never had a problem receiving those, so the problem has to be
>>> with the Sending side of things.
>>>
>>
>> I think you may have a problem with sign.  Windows Messages are unsigned 
>> values - some of them look negative to VB.CLASSIC, because it does not 
>> support an unsigned type.  What windows is seeing is going to be:
>>
>> Dim b As Long
>> b = CLng("&H" & Hex$(-2049))
>>
>> Which is the value: 63487
>>
>> Which is &HF7FF  and in fact, when that hex value is assigned to a vb long, 
>> you get 63487.
>>
>> So, my guess is that the value you are receiving is 63487, since that is 
>> under the value of 65536.
>
> Incorrect. The parameter is As Long, so -2049 gets sign extended to 32-Bit, 
> and would be &HFFFFF7FF.

Yes... I realized that as I was driving away from my home just a few 
minutes after posing. For some reason, I was thinking in 16-bit 2's 
complement rather then 32-bit.

Anyway, the number the op is looking for is really 4294965247

-- 
Tom Shelton


0
Reply Tom 8/29/2010 8:44:51 PM

On Sun, 29 Aug 2010 14:44:51 -0600, Tom Shelton
<tom_shelton@comcast.invalid> wrote:

>Nobody was thinking very hard :
>> "Tom Shelton" <tom_shelton@comcast.invalid> wrote in message 
>> news:i5e2v6$m5p$1@news.eternal-september.org...
>>> on 8/29/2010, Robert supposed :
>>>> Hi,
>>>>
>>>> Is there a reason why I can't send and receive a messages with a
>>>> negative number using SendMessage?
>>>>
>>>> The Windows common controls use negative notification messages and
>>>> I've never had a problem receiving those, so the problem has to be
>>>> with the Sending side of things.
>>>>
>>>
>>> I think you may have a problem with sign.  Windows Messages are unsigned 
>>> values - some of them look negative to VB.CLASSIC, because it does not 
>>> support an unsigned type.  What windows is seeing is going to be:
>>>
>>> Dim b As Long
>>> b = CLng("&H" & Hex$(-2049))
>>>
>>> Which is the value: 63487
>>>
>>> Which is &HF7FF  and in fact, when that hex value is assigned to a vb long, 
>>> you get 63487.
>>>
>>> So, my guess is that the value you are receiving is 63487, since that is 
>>> under the value of 65536.
>>
>> Incorrect. The parameter is As Long, so -2049 gets sign extended to 32-Bit, 
>> and would be &HFFFFF7FF.
>
>Yes... I realized that as I was driving away from my home just a few 
>minutes after posing. For some reason, I was thinking in 16-bit 2's 
>complement rather then 32-bit.
>
>Anyway, the number the op is looking for is really 4294965247

That's the number I want any language that has unsigned 32 bit
integers, to think I am sending.

I actually want to send -2049

To put it in context:

For reasons* which become less compelling by the hour, I'm writing a
Win32 style control in VB6 (i.e. The window is created with
CreateWindowEx and the api is all windows messages).

-2049 is just the constant I'd picked to represent a left button click
following the common controls convention of using negative numbers to
define notifications.

If it was a C header the definition would be:

#define CVN_FIRST       (0U-2048U) 
#define CVN_BUTTONCLICK (CVN_FIRST-1)

Which should translate to VB6 as:

Public Const CVN_FIRST = -2048&
Public Const CVN_BUTTONCLICK = CVN_FIRST - 1

Control Code:

If (SendMessage(m_hwndParent, CVN_BUTTONCLICK, ByVal 0&, nmhti) then
  ...
End if

The message isn't being received by the parent at all. Surely Windows
doesn't care (or know) that I'm sending a signed vb long rather than a
UINT.

Robert

*The main reason being that I wanted to see if I could.
0
Reply Robert 8/30/2010 3:59:38 AM

Oh bugger, I've just realised that I'm getting this completely wrong.

I'm talking about notification messdages so CVN_BUTTONCLICK would be
contained in the code field of an NMHDR structure received in the
lParam of a WM_NOTIFY message.

Please pretend this thread never happened.

Robert
0
Reply Robert 8/30/2010 4:34:56 AM

On Mon, 30 Aug 2010 05:34:56 +0100, Robert <noname@noserver.com>
wrote:
  
>Oh bugger, I've just realised that I'm getting this completely wrong.
<snip>
>Please pretend this thread never happened.

Remarkable how many times I've typed up a question and realized I was
a moron at the bottom.   Thankfully before I posted.  <smile>

Tony
-- 
Tony Toews, Microsoft Access MVP
Tony's Main MS Access pages - http://www.granite.ab.ca/accsmstr.htm
Tony's Microsoft Access Blog - http://msmvps.com/blogs/access/
For a convenient utility to keep your users FEs and other files 
  updated see http://www.autofeupdater.com/
0
Reply Tony 8/30/2010 5:43:48 AM

On Mon, 30 Aug 2010 05:34:56 +0100, Robert <noname@noserver.com>
wrote:

>Oh bugger, I've just realised that I'm getting this completely wrong.
>
>I'm talking about notification messdages so CVN_BUTTONCLICK would be
>contained in the code field of an NMHDR structure received in the
>lParam of a WM_NOTIFY message.
>
>Please pretend this thread never happened.
>
>Robert

And here's what I should have been doing.

'Helper function

Private Function Notify(ByVal code as long, _
                        ByRef hdr as NMHDR) as long)
  hdr.hwndfrom = m_hwnd
  hdr.idFrom = GetDlgCtrlID(m_hwnd)
  hdr.code = code
  Notify = SendMessage(GetParent(m_hwnd), WM_NOTIFY, ByVal 0&, hdr)
End Function

'Calling code

  Dim itemclick as NMITEMCLICK
  itemclick.iItem = iItem
  '(fill in other fields)

  If (Notify(CVN_ITEMCLICK, itemclick.hdr)) Then
    ...
  End If
  
'Control parent code

    Case WM_NOTIFY
      Dim hdr As NMHDR
      CopyMemory hdr, ByVal lParam, LenB(hdr)
      If (hdr.hwndFrom = m_hwnd) Then
        Select Case hdr.code
          Case CVN_ITEMCLICK
            Dim itemclick As NMITEMCLICK
            CopyMemory itemclick, ByVal lParam, LenB(itemclick)
            Debug.Print "ITEMCLICK:", itemclick.iItem
        End Select
      End If

0
Reply Robert 8/30/2010 6:07:19 AM

"Tom Shelton" <tom_shelton@comcast.invalid> wrote in message 
news:i5egtl$q5q$1@news.eternal-september.org...

> Yes... I realized that as I was driving away from my
> home just a few minutes after posing. For some reason,
> I was thinking in 16-bit 2's complement rather then 32-bit.

You shouldn't be doing hard sums whilst driving. It'll make your brain hurt 
and you'll have an accident, which will make your brain hurt even more ;-)

Mike



0
Reply Mike 8/30/2010 9:34:20 AM

9 Replies
721 Views

(page loaded in 0.108 seconds)


Reply: