用GPT写个mexFunction

描述

| 作者:老朽路人甲

最近有位用户想在 MATLAB 里用 m 代码实现一个将某个图形窗口最大化显示的功能,问我们有没有 MATLAB 函数支持这个。

大伙儿找了一圈没找到,老朽就建议不如用 C 写个 mexFunction,交给 MATLAB 调用就好了——虽然用 Python 也能写,MATLAB 调用 Python 更方便,但那得安装和配置 Python 环境,不太友好。

这年头自己写两行 C 代码实现这么简单的功能并不难,但既然有了 GPT,何不偷个懒。于是有了以下对话:

【内心 OS】能行么,还是先试试简单的

我:我想用 C 语言基于 windows api 实现这样一个功能,获得一个桌面上的带"Figure 1"具体标题的窗口,并将这个窗口最大化,能帮我写一个代码吗?

GPT:要实现这个功能,你可以使用 Windows API 中的 FindWindow 函数来查找窗口,然后使用 ShowWindow 函数来最大化它。下面是一个简单的示例代码,演示了如何查找标题为"Figure 1"的窗口并将其最大化:

 

#include 
#include 

int main() {
    // 查找窗口句柄
    HWND hwnd = FindWindow(NULL, TEXT("Figure 1"));
    if (hwnd == NULL) {
        printf("无法找到窗口
");
        return 1;
    }

    // 最大化窗口
    ShowWindow(hwnd, SW_MAXIMIZE);

    return 0;
}


 

这段代码首先尝试找到标题为"Figure 1"的窗口。如果找到了,就使用 ShowWindow 函数将其最大化。SW_MAXIMIZE 是一个宏,用于指示 ShowWindow 函数将窗口最大化。

请注意,这段代码假设窗口标题完全匹配"Figure 1"。如果窗口标题包含其他文本,那么你需要修改 FindWindow 函数的第二个参数以匹配实际的窗口标题。

还要注意的是,为了能够编译和运行这个程序,你需要在支持 Windows API 的环境中进行,比如使用 Microsoft Visual Studio 或者其他支持 Windows 开发的 IDE。

在运行此代码之前,请确保你有足够的权限来操作其他应用程序的窗口,因为某些安全设置可能会阻止你的程序执行这些操作。

【内心 OS】哟,看起来能工作呢,先不编译运行了,再试试复杂点的

我:谢谢,我想将"Figure 1"作为命令行的输入参数传进去,从而让这个程序可以获得任何指定标题的窗口并将其最大化,或者最小化。我想让最大化、最小化也作为输入参数,可以帮我修改一下程序吗?

GPT:当然可以。以下是修改后的C语言程序,它接受两个命令行参数:第一个是窗口标题,第二个是操作类型(最大化或最小化)。

#include #include #include int main(int argc, char *argv[]) { if (argc != 3) { printf("用法: %s <窗口标题> ", argv[0]); return 1; } // 获取命令行参数 LPCSTR windowTitle = argv[1]; char *operation = argv[2]; // 查找窗口句柄 HWND hwnd = FindWindow(NULL, windowTitle); if (hwnd == NULL) { printf("无法找到窗口: %s ", windowTitle); return 1; } // 根据命令行参数最大化或最小化窗口 if (strcmp(operation, "max") == 0) { ShowWindow(hwnd, SW_MAXIMIZE); } else if (strcmp(operation, "min") == 0) { ShowWindow(hwnd, SW_MINIMIZE); } else { printf("无效操作: %s ", operation); printf("操作必须是 'max' 或 'min' "); return 1; } return 0; }

 


 

这个程序首先检查命令行参数的个数是否正确。如果不正确,它会打印出正确的用法并退出。

然后,它读取窗口标题和操作类型参数。使用 FindWindow 函数查找窗口,如果找到了,根据操作类型参数调用 ShowWindow 函数以最大化或最小化窗口。

要编译和运行这个程序,你需要将它保存为 .c 文件,并在支持 Windows API 的环境中进行编译和运行。例如,在命令行中,你可以这样运行程序:

your_program.exe "Figure 1" max 或者

 

your_program.exe "Figure 1" min


 

上面的 your_program.exe 是编译后的程序名称,"Figure 1"是你想要操作的窗口标题, max 和 min 分别表示最大化和最小化窗口的操作。

【内心 OS】太可以了,让我编译运行一下

函数

【内心OS】居然零错误!

函数

【内心OS】直接能工作!

【内心 OS】厉害,它能直接给我生成 mexFunction 吗?试试!

我:你能把这个转换成 MATLAB 的 mexFunction 实现吗?

GPT:要将这个功能转换成 MATLAB 的 mexFunction,你需要使用 MATLAB 的 MEX API 来编写一个 C 函数,然后在 MATLAB 中编译它。以下是一个示例代码,它展示了如何创建一个 mexFunction 来实现相同的功能:

首先,你需要创建一个 C 源文件,例如 window_operations.c,代码如下:

#include "mex.h" #include #include void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { // 检查输入参数数量 if (nrhs != 2) { mexErrMsgIdAndTxt("window_operations:invalidNumInputs", "需要两个输入参数:窗口标题和操作类型。"); } // 获取输入参数 char *windowTitle = mxArrayToString(prhs[0]); char *operation = mxArrayToString(prhs[1]); if (windowTitle == NULL || operation == NULL) { mexErrMsgIdAndTxt("window_operations:inputConversionFailed", "输入参数转换失败。"); } // 查找窗口句柄 HWND hwnd = FindWindow(NULL, windowTitle); if (hwnd == NULL) { mexErrMsgIdAndTxt("window_operations:windowNotFound", "无法找到窗口: %s", windowTitle); } // 根据输入参数最大化或最小化窗口 if (strcmp(operation, "max") == 0) { ShowWindow(hwnd, SW_MAXIMIZE); } else if (strcmp(operation, "min") == 0) { ShowWindow(hwnd, SW_MINIMIZE); } else { mexErrMsgIdAndTxt("window_operations:invalidOperation", "无效操作: %s", operation); } // 释放分配的内存 mxFree(windowTitle); mxFree(operation); }然后,你需要在 MATLAB 中编译这个源文件。打开 MATLAB,然后在命令窗口中运行以下命令来编译 window_operations.c:

 

mex window_operations.c
编译成功后,你会得到一个名为 window_operations.mexw64(在 64 位 Windows 上)的可执行文件。现在你可以在 MATLAB 中像调用普通函数一样调用这个 MEX 函数了:
window_operations('Figure 1', 'max');
或者
window_operations('Figure 1', 'min');

 

这将分别最大化或最小化标题为"Figure 1"的窗口。

请确保在编译和运行 MEX 文件之前,你的 MATLAB 安装了支持 C 语言的 MEX 编译器,并且你有足够的权限来操作其他应用程序的窗口。

【内心 OS】这都会!不光生成了代码,还告诉了老朽怎么在 MATLAB 里编译它,以及怎么调用,太厉害了,跑一下!

 

>> mex window_operations.c
Building with 'Microsoft Visual C++ 2019 (C)'.
MEX completed successfully.
>> window_operations('MATLAB R2023b', 'max');
>>

 

一次性成功!连 debug 的机会都不给!

【结语】还能说什么!抓紧用起来,不然失业了!

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分