Как передать дату в чужое приложение?
h:=FindWindow(nil,'Form');
hd:=FindWindowEx(h,0,'TDateTimePicker',nil);
SendMessage(hd,WM_SETTEXT,0,lparam(LPCTSTR(PChar('23.03.1981'))));
Не работает.Подскажите как надо,плиз.
WinAPI и Delphi "не есть одно и то же". Параметр lpszClass - это класс окна, зарегистрированный с помощью функции WinAPI RegisterClass(Ex), который не имеет ничего общего с пространством имен борланда. У Вас имеет место быть "mix" WinAPI и VCL.
- hd:=FindWindowEx(h,0,'TDateTimePicker',nil);
Уверен, что hd после возрата равен NULL
Win32 SDK:
WinAPI и Delphi "не есть одно и то же". Параметр lpszClass - это класс окна, зарегистрированный с помощью функции WinAPI RegisterClass(Ex)
Согласен.
который не имеет ничего общего с пространством имен борланда. У Вас имеет место быть "mix" WinAPI и VCL.
- hd:=FindWindowEx(h,0,'TDateTimePicker',nil);
Не согласен. При чем тут протстранство имен Borland`а? Обект класса окна является системным и регистрируется в системе,и поэтому никакого отношению к пространству имен приложения он не имеет.
Уверен, что hd после возрата равен NULL
Не факт. Если только класс и нэндл родителя были правильны,hd должен быть хэндлом на нужное окно.
Скорее здесь проблема с WM_SETTEXT,не может передать данные между двумя процессами.
Не согласен. При чем тут протстранство имен Borland`а? Обект класса окна является системным и регистрируется в системе,и поэтому никакого отношению к пространству имен приложения он не имеет.
Прошу прощения, я некорректно выразился. Я хотел сказать, что имя класса окна, зарегистрированного в системе будет отлично от "TDateTimePicker". Только что запустил Spy++ и увидел, что имя класса окна это имя компонента (имя указанное в свойстве Name компонента). Так вот наверное его и следует подставить на вход FindWindow.
Прошу прощения, я некорректно выразился. Я хотел сказать, что имя класса окна, зарегистрированного в системе будет отлично от "TDateTimePicker". Только что запустил Spy++ и увидел, что имя класса окна это имя компонента (имя указанное в свойстве Name компонента). Так вот наверное его и следует подставить на вход FindWindow.
Ну тогда это возможно. Просто если контрол был создан из приложения напрямую через вызов CreateWindow то имя класса заданное в этой функции и будет реальным именем класса кторый и покажет spy++ а не другим,независимо от среды и языка где вызывается эта функция. В данном случае я так понял этот компонент был вставлен просто на форму,и соответсвтвенно у него используется класс по умолчанию,в описании контрола или через spy++ можно узнать какое точно имя для класса использует данный контрол.
Win32 SDK:
WinAPI и Delphi "не есть одно и то же". Параметр lpszClass - это класс окна, зарегистрированный с помощью функции WinAPI RegisterClass(Ex), который не имеет ничего общего с пространством имен борланда. У Вас имеет место быть "mix" WinAPI и VCL.
- hd:=FindWindowEx(h,0,'TDateTimePicker',nil);
Уверен, что hd после возрата равен NULL
hd не равен NULL,он содержит хэндл контрола.
h:=FindWindow(nil,'Form');
hd:=FindWindowEx(h,0,'TDateTimePicker',nil);
DateTime_SetFormat(hd,PChar('23.03.1981'));
В принципе это работает,но только передается строка в какой-то левой кодировке.Как правильно преобразовать дату?
Сейчас передаю так:
h:=FindWindow(nil,'Form');
hd:=FindWindowEx(h,0,'TDateTimePicker',nil);
DateTime_SetFormat(hd,PChar('23.03.1981'));
В принципе это работает,но только передается строка в какой-то левой кодировке.Как правильно преобразовать дату?
Можеш попробывать преобразовать в юникод так:
char in_str[]="Hello";
int len=(strlen((char*)in_str)+1)*sizeof(WCHAR);
LPWSTR out_str= (LPWSTR)malloc(len);
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,(LPCSTR)in_str,-1,out_str,len);
теперь в out_str конвертированая строка из ANSI в UNICODE