Рубрики
Tech

SendMessage в Windows::Forms под Visual C++ 2010

Возникла необходимость заюзать winapi-шную функцию в приложении Windows Forms на C++

Я потратил около шести часов, чтобы найти решение, потому что просто так написать

SendMessage(Handle, WM_CLOSE, 0, 0);

не достаточно. А интуицией догадаться может только экстрасенс.

Короче. В файл stdafx.h после тудушечки добавляем инклюд:

// TODO: Установите здесь ссылки на дополнительные заголовки...
#include "windows.h"

В свойствах проекта идем в Свойства конфигурацииКомпоновщикВвод, щелкаем по свойству Дополнительные зависимости (у правильных пацанов это называется Linker — Input — Additional dependencies) и выбираем из раскрывающегося списка <наследовать от родителя или от свойств проекта по умолчанию>. Возможно, придется выбрать пункт <Изменить...> и поставить там галку:

И только теперь мы можем вызывать тот же SendMessage(), но с обязательными предшествующими двойными двоеточиями и преобразованием численного значения указателя к структуре HWND. Вот так:

::SendMessage((HWND)this->Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, 2);

Ура! И главное совершенно очевидно, особенно с настройкой проекта.

7 ответов к “SendMessage в Windows::Forms под Visual C++ 2010”

Существует такая услуга — добровольное медицинское обслуживание (или ДМО).
Она предполагает, что пациент вносит небольшую сумму за абонемент и посещает врачей весь год не платя за каждый прием.
Однако опросы показывают, что лишь 4% жителей Питера знают о ее существовании.
Почему?
Да потому что частным клиникам выгоднее сдирать с людей деньги за каждое посещение.
А если какой-нибудь сотрудник клиники попытается рассказать про добровольное медицинское обслуживание клиенту — это сулит ему увольнением.
Эта информация уже вызвала множество возмущений, сразу после того как информацию об услуге распространил один врач.
Его уволили «по собственному желанию», после того, как он посоветовал ДМО постоянному клиенту.
Самое невероятное, что информация по ДМО присутствуют в открытом доступе, просто натыкались на эту информацию только случайные люди.
Как отстоять свои права?
О правилах оказания такой услуги и обязанностях частных клиник можно узнать, сделав запрос в Яндексе: «добровольное медицинское обслуживание».
И именно обслуживание, а не страхование.

34j5c6h86

Атрибуты это вообще полезная штука, можно и главный цикл обработки сообщений переопределить:

using namespace System::Security::Permissions;

//……..

public ref class MainWindow sealed : public System::Windows::Forms::Form
{

//………
[SecurityPermission(SecurityAction::Demand, Flags=SecurityPermissionFlag::UnmanagedCode)]
[SecurityPermission(SecurityAction::LinkDemand, Flags = SecurityPermissionFlag::UnmanagedCode)]
[SecurityPermission(SecurityAction::InheritanceDemand, Flags = SecurityPermissionFlag::UnmanagedCode)]
virtual void WndProc(System::Windows::Forms::Message% m) override;
};

//………

void Rail2::MainWindow::WndProc(System::Windows::Forms::Message% m)
{
try
{
if(m.Msg == WM_COPYDATA)
{
// ……….
}
}
finally
{
Form::WndProc(m);
}
}

Ололо, а я это делаю через ещё бОльшую жопу)

Добавляем

using System::Runtime::InteropServices::DllImportAttribute;

и определяем класс, внутри которого перегружаем соответствующую функцию

public ref class SenderClass sealed
{
public:
[DllImport(«User32.dll»)]
static void SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
};

не знаю, наверное можно и без класса обойтись — я этот пример копипастил из мана по си диезу, а в нём функций-не-членов нет в принципе, так что приходится вот так вот извращаться.

Ну и вместо приведения в стиле Си всё-таки лучше юзать касты:

SenderClass::SendMessage(static_cast(Proc->MainWindowHandle.ToPointer()), WM_COPYDATA, static_cast(MESSAGE_WPARAM), reinterpret_cast(&Msg));

Добавить комментарий