.net PHP DOTNET():捕获System.Windows.Forms控件事件以创建可用的WIN gui

.net PHP DOTNET():捕获System.Windows.Forms控件事件以创建可用的WIN gui,.net,user-interface,php,.net,User Interface,Php,我通过PHP的和制作了一个Windows GUI。但是,我一直在处理按钮点击、字段更新、表单打开/关闭事件等 我无法让com_event_sink()处理任何事件。我不知道有什么方法可以让PHP伪造或接收控制事件“委托”。我所能做的最好的事情就是黑客——不断监视控件属性以获取任何更改的提示——比如检查当前是否拖动了按钮而不是实际的单击事件。但这里我只能使用一两个可能的属性,它们甚至与用户交互有关。显然,如果不连接表单控件事件,这会使我的应用程序变得非常无能为力 使用PHP,是否有人能够连接到实际

我通过PHP的和制作了一个Windows GUI。但是,我一直在处理按钮点击、字段更新、表单打开/关闭事件等

我无法让com_event_sink()处理任何事件。我不知道有什么方法可以让PHP伪造或接收控制事件“委托”。我所能做的最好的事情就是黑客——不断监视控件属性以获取任何更改的提示——比如检查当前是否拖动了按钮而不是实际的单击事件。但这里我只能使用一两个可能的属性,它们甚至与用户交互有关。显然,如果不连接表单控件事件,这会使我的应用程序变得非常无能为力

使用PHP,是否有人能够连接到实际的System.Windows.Forms类事件中以生成有效的Windows GUI?如果是,怎么做?或者,是否有一个不同的组件,我应该看看呢?引用wezfurlong.org:。有人找到了一个不强迫你学习一门新语言的解决办法吗

这是我的工作测试GUI

<?php

$full_assembly_string = 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089';
$namespace = 'System.Windows.Forms';

// Main Form
$form = new DOTNET($full_assembly_string, $namespace.'.Form');
$form->Width = 450;
$form->Height = 550;
$form->Show();

// Textbox 1
$txt1 = new DOTNET($full_assembly_string, $namespace.'.TextBox');
$txt1->Name = "IP";
$txt1->Height = 400;
$txt1->Width = 400;
$txt1->Top = 40;
$txt1->Left = 5;
$txt1->Parent = $form;

// Textbox 2
$txt2 = new DOTNET($full_assembly_string, $namespace.'.TextBox');
$txt2->Height = 300;
$txt2->Width = 400;
$txt2->Top = 80;
$txt2->Left = 5;
$txt2->Multiline = True;
$txt2->ScrollBars = 3;
$txt2->Parent = $form;

// Button 1
$btn1 = new DOTNET($full_assembly_string, $namespace.'.Button');
$btn1->Height = 25;
$btn1->Width = 75;
$btn1->Text = "Backtrace";
$btn1->Top = 5;
$btn1->Left = 5;
$btn1->Parent = $form;

// Hack message/event capturing loop
while(true) {
    com_message_pump(1);
    // Check if 'Capture' property of Button 1 changed in lieu of actual click event
    if ((bool) $btn1->Capture) {
        $txt2->Text = "BACKTRACING ".$txt1->Name." ".$txt1->Text."!!";
        $btn1->Capture = false; // force release of the button
        }
    }

?>

我还对另一种选择感兴趣——PHP-GTK。有没有人通过将所需的libs与正常的PHP5.3安装重叠来实现这一点?我对安装PHP-GTK附带的预打包PHP版本不感兴趣,因为它已经过时多年了。但如果有人能告诉我从PHP-GTK包中挑选哪些dll文件,并选择将其放入我的普通PHP安装中,以使其像任何普通扩展一样工作,我会洗耳恭听

编辑:如果有人提到Winbinder,尽管我认为这些开发人员做得很好,但它只是一个分散的爱好项目,而且目前还没有集中维护以供使用


Update:除非有人知道一个窍门或一个特定的COM启用.NET程序集,它可以作为包装器,否则我认为这个问题是无法用本地PHP方法解决的。我不得不求助于制作我自己的VB.Net包装库,主要依靠VB.Net反射类作为中间层,将其注册为一个COM类,然后通过COM连接到-that-上。令人失望,但它开始起作用了。

自我回答。Dotnet类似乎没有完全的功能,依赖于COM可访问的类(大多数都不是),一些常见的.Net类型无法转换为PHP值(请参阅PHP bug跟踪器)。因此,在VB.Net中构建一个非常基本的包装器/API并使其成为一个COM类是我能找到的唯一方法。纯粹作为一个(开源)示例,请参见:

为什么???.NET编译器是免费的。@Jeremy:不知道你说的引用是什么意思。我的问题是关于使用PHP的命令行界面来生成和管理交互式WIN表单,以及我是如何遇到困难的。你似乎在试图把一个方形的钉子塞进一个圆形的孔中。只是指出,按照预期的方式执行此操作的工具是免费的。@Jeremy:其想法是通过使用标准的.Net程序集从PHP代码中生成GUI来测试PHP的DOTNET()类的限制。有人可能认为它应该与公共语言一起工作,但事实并非如此。我只是看看是不是有人比我运气好。