C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Subclassing a Window, не пойму, почему не работает
Schumi
Отправлено: 31.01.2006, 17:13


Машинист паровоза

Группа: Участник
Сообщений: 206



CODE

WNDPROC wpOrigEditProc;
//---------------------------------------------------------------------------
LRESULT APIENTRY EditSubclassProc(
   HWND hwnd,
   UINT uMsg,
   WPARAM wParam,
   LPARAM lParam)
{
if (uMsg == WM_SETTEXT) {
                        int k = Form1->Label2->Caption.ToInt();
                        k++;
                        Form1->Label2->Caption = IntToStr(k);
                       }
// в следующей строке ошибка
return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
wpOrigEditProc = (WNDPROC) SetWindowLong(Memo1->Handle,
               GWL_WNDPROC, (LONG) EditSubclassProc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
SetWindowLong(Memo1->Handle, GWL_WNDPROC,
               (LONG) wpOrigEditProc);      
}
//---------------------------------------------------------------------------


Она выдает:
E2342 Type mismatch in parameter 'lpPrevWndFunc' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(void *,unsigned int,unsigned int,long)')
Gedeon
Отправлено: 31.01.2006, 18:02


Ветеран

Группа: Модератор
Сообщений: 1742



АГа я вообще не понял, все законно что ему не нравится ХЗ, пока не понял, но еще поколупаюсь.
GIZMO
Отправлено: 31.01.2006, 22:09


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Gedeon @ 31/01/2006, 18:02)
АГа я вообще не понял, все законно что ему не нравится ХЗ, пока не понял, но еще поколупаюсь.

#define STRICT
Schumi
Отправлено: 01.02.2006, 09:14


Машинист паровоза

Группа: Участник
Сообщений: 206



У меня еще вопрос, правда немного не в тему, но является логич. продолжением.
Отчего я поперся в субклассинг?

Есть чужая программа — на ней всего-то: мемо и 2 баттон — "выполнить" и "отмена". При запуске появляется надпись на англ (мемо). Тыкается кнопка выполнить — она что-то делает и меняет мемо, а если тыкнуть отмена — тоже закроется.
Мне не нравится, что на англ. Я хотел заменить мемо wndproc на свой и отображать свой текст и для кнопок, чтобы названия всех контролов были моими.
Сам ехе чем-то запакован и все ресурсы типа есть, но они "повреждены", поэтому просто и наивно сделать не получилось.

Учитывая что так просто wndproc заменить нельзя в 2000/xp, я понял эта идея не самая лучшая. Поэтому хотел спросить как лучше поступить?
Я уже подумал, может сделать так: запустить из своей программы чужую, но чтобы она была hide, и нигде не отображалась, а потом через FindWindow программно нажать кнопку и прочитать мемо — узнать результат работы, а потом закрыть чужую прогу. Правда у меня возникают сомнения — будет ли создано вообще окно в этом случае для чужой проге?
Gedeon
Отправлено: 01.02.2006, 09:57


Ветеран

Группа: Модератор
Сообщений: 1742



Будет.
А что мешает менять нужный текст в проге с помощью того же FindWindow и SetWindowText?
Schumi
Отправлено: 01.02.2006, 16:18


Машинист паровоза

Группа: Участник
Сообщений: 206



Да, но это программа ведь меняет текст мемо в соответствии со своим алгоритмом работы несколько раз. А узнать момент? И что же ставить таймер, и смотреть, что находится в мемо?
Guest
Отправлено: 02.02.2006, 10:29


Не зарегистрирован







QUOTE (Schumi @ 01/02/2006, 16:18)
Да, но это программа ведь меняет текст мемо в соответствии со своим алгоритмом работы несколько раз. А узнать момент? И что же ставить таймер, и смотреть, что находится в мемо?

Зачем таймер, установить глобальный хук. И вообще по моему засабкласить процедуру окна полученного FindWindow не удастся.
Schumi
Отправлено: 03.02.2006, 11:25


Машинист паровоза

Группа: Участник
Сообщений: 206



Ну как сказать, в 98 без проблем, а в nt, да геморойно.

Вернуться в Вопросы программирования в C++Builder