Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Отправка оконных сообщений из C# к Delphi: как решить проблему с неверным оконным хэндлом

Delphi , ОС и Железо , Справочник по сообщениям

Отправка оконных сообщений между приложениями на разных языках программирования может быть полезной для обмена данными или синхронизации действий между ними. В этом руководстве мы рассмотрим, как отправить оконное сообщение из приложения на C# к приложению на Delphi.

Проблема

Разработчик столкнулся с проблемой отправки оконного сообщения из приложения на C# к приложению на Delphi. У него получилось отправлять сообщения между приложениями на C# и между приложениями на Delphi, но не между приложениями на разных языках.

Код для отправки сообщения из C

Вот код для отправки оконного сообщения из приложения на C#:

void Game1_Exiting(object sender, EventArgs e)
{
    Process[] Processes = Process.GetProcesses();

    foreach(Process p in Processes)
        if(p.ProcessName == Statics.MainAppProcessName)
            SendMessage(p.MainWindowHandle, WM_TOOTHUI, IntPtr.Zero, IntPtr.Zero);
}

private const int WM_TOOTHUI = 0xAAAA;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int SendMessage(IntPtr hwnd, [MarshalAs(UnmanagedType.U4)] int Msg, IntPtr wParam, IntPtr lParam);

В этом коде мы получаем все запущенные процессы и ищем процесс с именем Statics.MainAppProcessName. Если такой процесс найден, мы отправляем ему оконное сообщение с помощью функции SendMessage(). Константа WM_TOOTHUI определяет уникальный код сообщения, которое мы хотим отправить.

Код для приема сообщения в Delphi

Вот код для приема оконного сообщения в приложении на Delphi:

const
  WM_TOOTHUI = 43690;
type
  private
    MsgHandlerHWND : HWND;
    procedure WndMethod(var Msg: TMessage);
  public
    procedure WndMethod(var Msg: TMessage);
    procedure FormCreate(Sender: TObject);
  end;

procedure TForm1.WndMethod(var Msg: TMessage);
begin
  if Msg.Msg = WM_TOOTHUI then
  begin
    Caption := 'Message Recieved';
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MsgHandlerHWND := AllocateHWnd(WndMethod);
end;

В этом коде мы определяем константу WM_TOOTHUI, которая соответствует коду сообщения, отправляемому из приложения на C#. Мы также определяем процедуру WndMethod, которая будет обрабатывать это сообщение. В методе FormCreate() мы выделяем оконный хэндл и связываем его с нашей процедурой WndMethod.

Решение проблемы

После некоторых исследований разработчик понял, что проблема заключалась в том, что он отправлял сообщение на неправильный оконный хэндл. Он отправил сообщение на хэндл главного окна процесса, но процедура обработки сообщений была связана с другим хэндлом, созданным с помощью функции AllocateHWnd().

Решением этой проблемы было либо переопределение метода WndProc() в классе TForm1, либо использование специальной синтаксис обработки сообщений в Delphi. Вот примеры кода для обоих подходов:

Подход 1: Переопределение метода WndProc()

// в объявлении класса:
procedure WndProc(var Message: TMessage); override;

// реализация:
procedure TForm1.WndProc(var Message: TMessage);
begin
  if Msg.Msg = WM_TOOTHUI then
  begin
    Caption := 'Message Recieved';
  end;
  inherited;
end;

Подход 2: Использование специального синтаксиса обработки сообщений в Delphi

// в объявлении класса:
procedure WMToothUI(var Message: TMessage); message WM_TOOTHUI;

// реализация:
procedure TForm1.WMToothUI(var Message: TMessage);
begin
  Caption := 'Message Recieved';
end;

Также было отмечено, что если приложение Delphi запускается с правами администратора, сообщение может быть заблокировано из-за правил UIPI. В этом случае приложению C# также понадобится запускаться с правами администратора, чтобы отправить сообщение.

Наконец, если приложение C# отправляет сообщение на главный оконный хэндл процесса, а не на хэндл главного окна приложения, может потребоваться использование функции FindWindow() или EnumWindows() для нахождения нужного окна.

Заключение

Отправка оконных сообщений между приложениями на разных языках программирования может быть полезной для обмена данными или синхронизации действий между ними. В этом руководстве мы рассмотрели, как отправить оконное сообщение из приложения на C# к приложению на Delphi. Мы также рассмотрели некоторые общие проблемы, с которыми может столкнуться разработчик при отправке оконных сообщений, и предложили решения для этих проблем.

Создано по материалам из источника по ссылке.

В руководстве рассматривается отправка оконных сообщений из приложения на C# к приложению на Delphi для обмена данными или синхронизации действий между ними.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по сообщениям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 14:54:36/0.0033440589904785/0