Кусок wndproc. Активация/деактивация контролов в зависимости от состояния чекбокса. Код (Text): ;uMsg==WM_COMMAND, eax==LOWORD (wParam)==ID контрола, HIWORD(wParam)==BN_CLICKED .elseif eax==CHK_SOUND invoke IsDlgButtonChecked, hDlg, eax mov EnableSnd,eax mov ebx,eax mov esi,STC_SOUND @@: invoke GetDlgItem, hWin, esi invoke EnableWindow, eax, ebx inc esi cmp esi,BTN_SOUND+1 jl @B .elseif eax==CHK_WIN invoke IsDlgButtonChecked, hDlg, eax mov EnableAll,eax mov ebx,eax mov esi,STC_BACK @@: invoke GetDlgItem, hWin, esi invoke EnableWindow, eax, ebx inc esi cmp esi,CHK_WIN jl @B Второй цикл (по eax==CHK_WIN) работает как при посылке WM_COMMAND программно из другой процедуры, так и при WM_COMMAND от винды при клике мышью Перый цикл (по eax==CHK_SOUND) при клике мышью работает, а если сообщение послать самому из программы, то контролы с ID STC_SOUND - BTN_SOUND не становятся disable. Все параметры для GetDlgItem и EnableWindow одинаковы как при клике, так и при посылке WM_COMMAND программно. GetLastError равен нулю. EnableWindow возвращает ноль, что значит: предыдущее состояние было активное и переключено в неактивное. Хотя на деле так и остаются активными. Код (Text): Это параметры GetDlgItem и EnableWindow при каждом из трёх проходов цикла В случае клика мышью eax = 591498 (SetDlg.asm, 55) hWin = 984698 (SetDlg.asm, 57) esi = 1008 (SetDlg.asm, 58) ebx = 0 (SetDlg.asm, 59) ---------------------------------------- eax = 591500 (SetDlg.asm, 55) hWin = 984698 (SetDlg.asm, 57) esi = 1009 (SetDlg.asm, 58) ebx = 0 (SetDlg.asm, 59) ---------------------------------------- eax = 591508 (SetDlg.asm, 55) hWin = 984698 (SetDlg.asm, 57) esi = 1010 (SetDlg.asm, 58) ebx = 0 (SetDlg.asm, 59) ---------------------------------------- и в случае программного WM_COMMAND eax = 591498 (SetDlg.asm, 55) hWin = 984698 (SetDlg.asm, 57) esi = 1008 (SetDlg.asm, 58) ebx = 0 (SetDlg.asm, 59) ---------------------------------------- eax = 591500 (SetDlg.asm, 55) hWin = 984698 (SetDlg.asm, 57) esi = 1009 (SetDlg.asm, 58) ebx = 0 (SetDlg.asm, 59) ---------------------------------------- eax = 591508 (SetDlg.asm, 55) hWin = 984698 (SetDlg.asm, 57) esi = 1010 (SetDlg.asm, 58) ebx = 0 (SetDlg.asm, 59) Почему поведение может так отличаться при одинаковых входных данных?
Как сделать контролы неактивными я знаю. Меня это не интересует. Меня интересует, ПОЧЕМУ invoke EnableWindow, 657370, 0 не делает то же самое, что и invoke EnableWindow, 657370, 0 при последующем вызове при условии что 657370 - валидный хэндл в обоих случаях. Иными словами, почему два одинаковых вызова приводят к разным результатам.
Если кто и потратил время зря, то это я. Благодаря твоей невнимательности и неумению читать вопрос. В следующий раз внимательно читай вопрос, прежде чем отвечать.