<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我正在尝试编写一个脚本来正确计算自定义设计器和设计评估器中分体式设计的功率。问题是没有使用正确的自由度,虽然现在可以更改它们,但每次更改自由度或信噪比时,功率分析的轮廓框都会崩溃,并且有很多不必要的按钮点击在。另外,我无法确定如何计算分体式设计的非中心性参数,因此我不能只编写脚本从头开始进行数学计算。在 JMP 10 中,非中心参数是功效分析中的隐藏列,我可以将其作为矩阵获取。
我想要做的是编写一个用户可以在自定义设计器或设计评估器中运行的脚本,并让它同时使用多个信噪比来计算它们的功率。为此,我的脚本需要能够更改 JMP 平台中的信噪比,并让 CD 或 DE 重新计算 NCP。
我可以更改 NumberColEditBox 值,但无法让平台重新计算 NCP。
win = Window("DOE - 定制设计"); //连接到窗口以进行测试
win[OutlineBox(15)] << 关闭(0); //这是功率分析轮廓框
win[NumberColBox(9)] << 隐藏(0); //这是NCP列
ncp1 = win[NumberColBox(9)] << 获取为矩阵; //保存NCP列
win[NumberColEditBox(4)] << SetValues([4]); //这会将框中的信噪比值更改为 4
如何模拟回车键让平台重新计算?
我会注意到,当我从脚本更改框中的值并只需单击该框并按 Enter 键时,什么也没有发生。当我输入刚刚更改的数字并按 Enter 键时,什么也没有发生。如果我输入任何其他数字,它就会正常工作。(该序列类似于, win[NumberColEditBox(4)] << SetValues([4]); 按 Enter 键,无任何内容 -> 在框中键入 4,按 Enter 键,无任何内容 -> 在框中键入 3,按 Enter 键,作品)
一些带有按键功能的示例 - Windoze keybd_event 函数与 VK_RETURN
希望这可以帮助。
最好的,
-马特
// keypress_example.jsl
// 马特·弗林 -
// 尝试按键时要小心 - 可能会变得有趣
// http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx
// http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx
// http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx
// http://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx
// http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx
VK_ESCAPE = 十六进制转数字( "0000001B" );
VK_H = 十六进制转数字( "00000048" );
VK_E = 十六进制转数字( "00000045" );
VK_L = 十六进制转数字( "0000004C" );
VK_O = 十六进制转数字( "0000004F" );
VK_F = 十六进制转数字( "00000046" );
VK_R = 十六进制转数字( "00000052" );
VK_M = 十六进制转数字( "0000004D" );
VK_J = 十六进制转数字( "0000004A" );
VK_M = 十六进制转数字( "0000004D" );
VK_P = 十六进制转数字( "00000050" );
VK_SPACE = 十六进制转数字( "00000020" );
VK_SHIFT = 十六进制转数字( "00000010" );
VK_RETURN = 十六进制转数字( "0000000D" );
VK_1 = 十六进制转数字( "00000031" );
KEYEVENTF_EXTENDEDKEY = 十六进制转数字( "00000001" ); //&H1
KEYEVENTTF_KEYDOWN = 0;
KEYEVENTF_KEYUP = 十六进制转数字( "00000002" ); //&H2
kernel32 = 加载 Dll( "kernel32" );
kernel32 << DeclareFunction( "睡眠", 约定( STDCALL ), Alias( "睡眠" ),
Arg( Int32, "dwMilliseconds" ),
返回(无效)); //如果函数成功,返回值非零。
user32 = 加载Dll(“User32”);
user32 << DeclareFunction( "FindWindowA", 约定( STDCALL ), Alias( "FindWindow2" ),
Arg( UInt32, 输入, "lpClassName" ),
Arg(AnsiString(200),输入,“lpCaption”),
返回(UIntPtr)
); // hWnd
user32 << DeclareFunction( "SetForegroundWindow", 约定( STDCALL ), Alias( "SetForegroundWindow" ),
arg( UIntPtr, "hWnd" ),
返回(UInt32)
);
user32 << DeclareFunction( "keybd_event", 约定( STDCALL ), Alias( "keybd_event" ),
Arg( UInt8, "bVk" ), //[in] 指定虚拟键代码。 该代码必须是 1 到 254 范围内的值。 有关完整列表,请参阅虚拟键代码。
arg( UInt8, "bScan" ),
arg( UInt32, "dwFlags" ),
Arg( UIntPtr, "dwExtraInfo" ),
返回(无效));
user32 << DeclareFunction( "GetKeyState", 约定( STDCALL ), Alias( "GetKeyState" ),
Arg( Int32, "nVirtKey" ), //[in] 指定虚拟键。 如果所需的虚拟键是字母或数字(A 到 Z、a 到 z 或 0 到 9),则必须将 nVirtKey 设置为该字符的 ASCII 值。 对于其他键,它必须是虚拟键代码。
返回( Int32 ) ); //返回值指定指定虚拟按键的状态,如下:
//如果高位为1,则按键按下;否则,就结束了。
//如果低位为1,则按键被切换。 诸如 CAPS LOCK 键之类的键在打开时会被切换。 如果低位为 0,则按键关闭且未切换。 当按键被切换时,键盘上的切换键的指示灯(如果有)将亮起;当按键未被切换时,键盘上的指示灯将熄灭。
shell32=加载Dll(“shell32”);
shell32 << DeclareFunction( "ShellExecuteA", 约定( STDCALL ), Alias( "ShellExecute" ),
Arg( UIntPtr, 输入, "hWnd" ),
Arg( AnsiString( 20 ), "lpOperation" ),
arg( AnsiString( 256 ), "lpFile" ),
Arg( AnsiString( 256 ), "lpParameters" ),
/* Arg( UInt32, "lpParameters" ), */
arg( UInt32, "lpDirectory" ),
arg( UInt32, "nShowCmd" ),
返回(UInt32)
); //如果函数成功,则返回一个大于32的值。
保存文本文件( "C:\temp\deleteme.txt", "'Hello World' from JMP" );
目录名 = "C:\temp";
fname = "C:\temp\deleteme.txt";
// 在记事本中打开
rc = shell32 << ShellExecute( 0, "打开", "notepad.exe", " ", 0, 1 );
lpCaption = "无标题-记事本";
rc = kernel32 << 睡眠( 2 ); // 暂停以让记事本打开
// 在Excel中打开
//rc = shell32 << ShellExecute( 0, "打开", "Excel.exe", " ", 0, 1 );
//lpCaption = "Microsoft Excel - Book1";
// 等待打开
rc = kernel32 << 睡眠( 200 ); // 暂停以让记事本打开
hWnd = user32 << FindWindow2( 0, lpCaption );
rc = user32 << SetForegroundWindow( hWnd );
键 = 函数( { l_key },
user32 << keybd_event( l_key, 0, 0, 0 ); // 按键
user32 << keybd_event( l_key, 0, KEYEVENTF_KEYUP, 0 ); // 释放键
);
user32 << keybd_event( VK_SHIFT, 0, 0, 0 ); // 按键
键(VK_H);
user32 << keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0 ); // 释放键
密钥(VK_E);
密钥(VK_L);
密钥(VK_L);
键(VK_O);
键(VK_SPACE);
密钥(VK_F);
密钥(VK_R);
键(VK_O);
密钥(VK_M);
键(VK_SPACE);
user32 << keybd_event( VK_SHIFT, 0, 0, 0 ); // 按键
密钥(VK_J);
密钥(VK_M);
密钥(VK_P);
密钥(VK_1);
user32 << keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0 ); // 释放键
键(VK_RETURN);
user32 << UnloadDll( );
shell32 << UnloadDll( );
kernel32 << UnloadDll();