公司给客户开发的web程序A,有个表单里面是项目信息,客户有另一个web程序B(另一个公司开发的),也有一个表单里面是项目信息,现在客户要求,填写A时要把比较长的内容(比如项目名称)自动填写到B的表单上,由于浏览器的同源策略以及对剪切板访问的限制,顾通过js操作剪切板这个思路基本走不通。
后来上网查阅相关内容改用如下思路:
1.程序A中通过JS操作剪切板将项目信息存放到剪切板
2.C#开发一个winform程序,该程序加了一个定时器,每秒取一次剪切板,将项目信息读取存放到一个数组中,在该程序中通过键盘钩子监听ALT+P按键,先点击程序B的表单使获得焦点,按下ALT+P按键时,将数组内容通过剪切板和模拟键盘ctrl+v和tab操作,依次复制到目标表单中。
目前遇到的问题是当按下ALT+P时,程序B的表单立刻失去焦点(我把表单换成一个空的文本文件用记事本打开测试,记事本也失去焦点),由于失去焦点,模拟按键ctrl+v和tab操作也无法完成后续动作,我在响应函数加了System.Windows.Forms.MessageBox.Show弹窗,当点击弹窗确认按钮时却运行正常,请问大神这是什么原因
因为字数限制只能截取部分代码了,后面会贴出来的,谢谢大家
//3.判断输入键值(实现KeyDown事件)
private void hook_KeyDown(object sender, KeyEventArgs e)
{
//判断按下的键(Alt + P)
if (e.KeyValue == (int)Keys.P && (int)Control.ModifierKeys == (int)Keys.Alt)
{
//System.Windows.Forms.MessageBox.Show("按下了指定快捷键组合");
strArr[0] = this.textBox1.Text;
strArr[1] = this.textBox2.Text;
strArr[2] = this.textBox3.Text;
strArr[3] = this.textBox4.Text;
//radioButton1对应公开招标单选按钮
if (this.radioButton1.Checked)
{
publicBid();
}
////radioButton2对应竞价采购单选按钮
if (this.radioButton2.Checked) {
priceBid();
}
}
}
[System.Runtime.InteropServices.DllImport("user32")]
private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
//移动鼠标
const int MOUSEEVENTF_MOVE = 0x0001;
//模拟鼠标左键按下
const int MOUSEEVENTF_LEFTDOWN = 0x0002;
//模拟鼠标左键抬起
const int MOUSEEVENTF_LEFTUP = 0x0004;
//模拟鼠标右键按下
const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
//模拟鼠标右键抬起
const int MOUSEEVENTF_RIGHTUP = 0x0010;
//模拟鼠标中键按下
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
//模拟鼠标中键抬起
const int MOUSEEVENTF_MIDDLEUP = 0x0040;
//标示是否采用绝对坐标
const int MOUSEEVENTF_ABSOLUTE = 0x8000;
private void publicBid()
{
//mouse_event模拟鼠标单击是为了强制让表单B获取焦点,实际上加了也没用
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
foreach (string v in strArr)
{
//System.Windows.Forms.MessageBox.Show(v);
Clipboard.SetText(v);
ctrlVClick();
tabClick();
}
}
private void priceBid()
{
//mouse_event模拟鼠标单击是为了强制让表单B获取焦点,实际上加了也没用
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
for (int i = 0; i < hitNumbers; i++)
{
//System.Windows.Forms.MessageBox.Show(strArr[i]);
Clipboard.SetText(strArr[i]);
ctrlVClick();
tabClick();
if (i == 2)
{
tabClick();
}
}
}
下面是程序运行截图