How do I pass variables from a MATLAB script to C++?
8 次查看(过去 30 天)
显示 更早的评论
I would like to pass data stored in a MATLAB script variable to a C++ variable.
Please could someone let me know how I can implement this. Some step-by-step instructions would be very useful.
Many thanks.
2 个评论
Geoff Hayes
2014-8-23
Paul - what do you intend to do with the variable passed to the C++ function? Return something back to MATLAB? See write C/C++ source files for some examples on writing C/C++ functions and classes, and how to pass data from MATLAB to the function.
回答(2 个)
Friedrich
2014-8-25
编辑:Friedrich
2014-8-25
Hi,
Why don't you use JAVA for this? It is way easier to move the mouse with JAVA than with platform dependent c++ code. See the Robot Class:
So the MATLAB code would be:
robot = java.awt.Robot()
robot.mouseMove(0,0)
I can't be any easier than this I think.
0 个评论
Geoff Hayes
2014-8-23
Paul - if you just want to call the Windows SetCursorPos API from within MATLAB, then you can create a simple C-file based on the link I posted in my comment
#include "mex.h"
#include <windows.h>
#include <winuser.h>
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
double *ptr = 0;
double xOffset = 0;
double yOffset = 0;
HWND window = GetDesktopWindow;
// get the input offsets
if (nrhs>=1)
{
ptr = mxGetPr(prhs[0]);
xOffset = *ptr;
}
if (nrhs>=2)
{
ptr = mxGetPr(prhs[1]);
yOffset = *ptr;
}
printf("offsets are %f %f\n", xOffset, yOffset);
if (window)
{
RECT rect = {0};
GetClientRect(window, &rect);
SetCursorPos(rect.right+xOffset, rect.bottom+yOffset);
}
}
Just save this file as (for example) setcursropos.c (which will be the name of the MEX function that you will call from your MATLAB code) and build the MEX file by typing the following in the (MATLAB) Command Window
mex setcursropos.c
If MEX has been set up with a C/C++ compiler, you should see something like
Building with 'lcc-win32'.
MEX completed successfully.
I am using R2014a so the default compiler is lcc-win32.
The inputs to this function are offsets from the Desktop window rectangle top-left corner. You can call this function to move the cursor around from within your MATLAB code, or just from the Command Window as
% zero offsets so cursor should be set to top-left corner
setcursorpos(0,0)
% cursor should be set to (roughly) bottom-left corner
setcursorpos(0,10000)
% cursor should be set to (roughly) bottom-right corner
setcursorpos(10000,10000)
% cursor should be set to (roughly) top-right corner
setcursorpos(10000,0)
% cursor should be set to somwhere away from edges
setcursorpos(500,500)
Note how we invoke the function using the name of the C-file. You should be able to adapt the above to translate coordinates from your MATLAB code to the appropriate cursor position.
Try it and see what happens!
4 个评论
Geoff Hayes
2014-8-24
Paul - I just compiled your file thinking that I wouldn't see the same error and I did! There is just one bug in the code. The mexFunction signature is (in your file) is defined as
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray prhs[] )
which is slightly different than mine. Check the last input parameter - prhs should be a pointer like plhs. So because this signature is different from the standard mexFunction signature, then the redeclaration error is clear.
Just change the signature to
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
recompile, and it should work. (It did for me!)
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!