Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема в работе с функцией SendMessage  (Прочитано 10030 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Koronator
Новенький

ru
Offline Offline

« : 23-09-2013 18:52 » 

Я полный нуб в С++, это моя первая программа на этом языке (сам пишу на PHP).
Моя задача создать программу, которая смотрит какое окно в текущий момент активно у пользователя и если это окно браузера, то сохранять адрес страницы в базе данных. Для простоты эксперимента я начал с того, чтобы узнать адрес страницы открытой в браузере Internet Explorer. Описываю все свои шаги, потому как не знаю где кроется решение проблемы.

1. Создаю новый проект в Visual Studio, как Win32 Console Application (при создании ставлю галку Empty Project)
2. Далее захожу в свойства проекта и изменяю параметр Character Set на "Not Set"
3. Потом создаю cpp файл со следующим кодом
Код: (C++)
#include <windows.h>
#include <iostream>
#include <locale.h>

using namespace std;

void main()
{
        setlocale(LC_ALL, "rus");
        HWND hwnd;
        int code_value = 255;
        char asciiChar = static_cast<char>(code_value);
        char caption[1000]={asciiChar};
        hwnd = GetDesktopWindow();
        hwnd = FindWindowEx(hwnd, NULL, "IEFrame", NULL);
        hwnd = FindWindowEx(hwnd, NULL, "WorkerW", NULL);
        hwnd = FindWindowEx(hwnd, NULL, "ReBarWindow32", NULL);
        hwnd = FindWindowEx(hwnd, NULL, "Address Band Root", NULL);
        hwnd = FindWindowEx(hwnd, NULL, "Edit", NULL);

        SendMessage(hwnd, EM_GETLINE, sizeof(caption), (LPARAM)caption);

        if (strlen(caption)>0) cout << "Адрес открытой страницы: " << caption << endl;
}

Программа работает, но с некоторой оговоркой - если длина адресной строки страницы больше 254 символов, то строка полученная через SendMessage обрезается до 254.

если вместо кода
Код: (C++)
int code_value = 255;
char asciiChar = static_cast<char>(code_value);
char caption[1000]={asciiChar};

я пишу просто
Код: (C++)
char caption[1000]="";
то SendMessage возращает вообще пустую строку. Проблема как я понял зарыта тут http://msdn.microsoft.com/en-us/library/vstudio/bb761584.aspx, а именно важен текст "A pointer to the buffer that receives a copy of the line. Before sending the message, set the first word of this buffer to the size, in TCHARs, of the buffer. For ANSI text, this is the number of bytes; for Unicode text, this is the number of characters. The size in the first word is overwritten by the copied line."
и возможно еще это " The return value is zero if the line number specified by the wParam parameter is greater than the number of lines in the edit control."

Уважаемые форумчане, подскажите пожалуйста, что мне нужно поправить в программе, чтобы адресная строка целиком попадала в переменную caption?
Сутки мучаюсь, не могу найти решение, а решение скорее всего очень простое.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 23-09-2013 20:38 » 

del
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Koronator
Новенький

ru
Offline Offline

« Ответ #2 : 23-09-2013 20:43 » 

Написано же, что хочет паскалевскую строку. В первое слово буфера записать длину строки. Причём должен быть тип TCHAR, а не char. char там будет лишь при мультибайтовых строках в проекте.
А как это сделать? Просто на PHP с типами данных вообще не заморачиваюсь, там интерпретатор сам решает, в зависимости от контекста, а тут я не понимаю что значит "В первое слово буфера записать длину строки". Как именно это сделать?
Могли бы пример простой написать как это делается?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 23-09-2013 20:49 » 

Koronator, прежде чем приступать к практике надо хотя бы ознакомиться с теорией.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 23-09-2013 20:53 » 

Koronator, в твоём коде записывается первый байт, а не первое слово. Слово тип WORD. По крайней мере для 32-х бит оно равно 2-м байтам.

Простейший способ - reinterpret_cast указателя.
Код: (C++)
const int n = 10;
TCHAR buf[n];
*reinterpret_cast<WORD *>(buf) = n;
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Koronator
Новенький

ru
Offline Offline

« Ответ #5 : 23-09-2013 20:56 » new

Koronator, прежде чем приступать к практике надо хотя бы ознакомиться с теорией.
Согласен, я начал читать книгу Айвора Хортона "Visual C++ 2010 Полный курс" но на это нужно время, а задачу нужно решить сейчас.

Koronator, в твоём коде записывается первый байт, а не первое слово. Слово тип WORD. По крайней мере для 32-х бит оно равно 2-м байтам.

Простейший способ - reinterpret_cast указателя.
Код: (C++)
const int n = 10;
TCHAR buf[n];
*reinterpret_cast<WORD *>(buf) = n;

Спасибо большое, сейчас попробую исправить.

Добавлено через 10 минут и 8 секунд:
Огромное спасибо еще раз, теперь все работает как надо.
« Последнее редактирование: 23-09-2013 21:06 от Koronator » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines