C#.Net Windows消息到Delphi - c#

我在c#应用程序和delphi应用程序之间遇到Windows消息问题。

我用c#到c#和delphi到delphi做了一些例子,但是我不能c#到delphi

这是我相关的C#应用​​,它是WM发送者代码

    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);

这是我相关的delphi应用,它是WM接收者代码

    const
      WM_TOOTHUI = 43690;
    type
      private
        MsgHandlerHWND : HWND;
        procedure WndMethod(var Msg: TMessage);

    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;

提前致谢。

参考方案

您正在将消息发送到主窗口句柄。那就是TForm1实例的句柄。但是您的窗口过程将附加到另一个窗口句柄,该窗口句柄是通过调用AllocateHWnd创建的。

一个简单的解决方法是在WndProc中覆盖TForm1而不是使用AllocateHWnd

// in your class declaration:
procedure WndProc(var Message: TMessage); override;

// the corresponding implementation:
procedure TForm1.WndProc(var Message: TMessage);
begin
  if Msg.Msg = WM_TOOTHUI then
  begin
    Caption := 'Message Recieved';
  end; 
  inherited;
end;

或如Mason所说,您可以使用Delphi的特殊消息处理语法:

// in your class declaration:
procedure WMToothUI(var Message: TMessage); message WM_TOOTHUI;

// the corresponding implementation:
procedure TForm1.WMToothUI(var Message: TMessage);
begin
  Caption := 'Message Recieved';
end;

p.MainWindowHandle甚至可能不是主窗口的句柄。如果使用的是Delphi的旧版本,则p.MainWindowHandle可以找到应用程序的句柄Application.Handle。在这种情况下,您将需要在C#代码中使用FindWindowEnumWindows来找到所需的窗口。

另外,如果您在Delphi中使用十六进制声明消息常量,则代码将更加清晰:

WM_TOOTHUI = $AAAA;

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

从ASP.NET 1.1转换为ASP.Net 3.5后,单选按钮停止工作 - javascript

[我在下面以FYI的形式发布我们的问题和解决方案。如果您有Microsoft或代表机构对此问题的正式声明,我会将其标记为答案。否则,我下面的帖子将作为答案]。问题:我们采用了ASP.Net 1.1程序,并将其转换为ASP.Net 3.5。该页面最初正确显示,默认情况下选中一个单选按钮,并显示一个项目列表(“列表A”)。当我们单击另一个单选按钮时,它将正确显示…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

在ASP.NET MVC中创建数据库回调的最有效方法 - c#

我有一个ASP.NET MVC网页,该网页基本上通过日期过滤器显示MS SQL数据库中表的行。当新行插入数据库表时,我想用新行列表更新网页视图。实现此目标的最有效方法是什么?基本上,我想从我的JavaScript创建一个到数据库服务器的回调,以用新结果更新UI。假设数据库表中的行数很大。(〜1百万)谢谢,cas 参考方案 如果数据库更新非常频繁,则可以按特定…

如何使用JavaScript访问嵌入式ASP.NET GlobalResources? - javascript

我正在开发一个遗留的ASP.NET项目,该项目正试图缓慢地进行调整,但是如果没有像巧克力手指屋一样塌陷的情况,我将无法进行重大更改。我试图为此找到解决方案,但由于术语的特定混合(“ javascript”,“ embedded”和/或“ resource”只是为我提供了有关如何嵌入.js文件的信息,而失败了)。 。),这可能是一种怪异的处理方式。该项目将Ap…