2016-08-18 53 views
0

下午好位置,WPF C#问题与得到passwordBox(X,Y)

我需要得到PasswordBox这是什么地方放置我的形式被称为“LogInWindow.xaml”上的位置,因为我想模拟psyhical /鼠标点击该文本框。

我媒体链接有其接受两个参数的功能,这是做点击这些参数为:x & Y,它应该是目标控制的位置,这里是功能:

public static void LeftMouseClick(int xpos, int ypos) 
    { 
     SetCursorPos(xpos, ypos); 
     mouse_event(MOUSEEVENTF_LEFTDOWN, xpos, ypos, 0, 0); 
     mouse_event(MOUSEEVENTF_LEFTUP, xpos, ypos, 0, 0); 
    } 

所以我很在这里失踪是xposypos(目标控制的坐标),这里是其中一个方法我试图让位置,但它不是很遗憾工作:

Point relativePoint = txtPassword.TransformToAncestor(Application.Current.MainWindow) 
         .Transform(new Point(0, 0)); 

我得到了错误的TX tPassword说: 错误14字段初始值设定项不能引用非静态字段,方法或属性'Main.LogInWindow.txtPassword'

我终于通过@FrancisLord建议做了这个工作。

但现在我面临的另一个问题,我想测试这一另一台计算机/显示器上,和我复制我的.exe文件,我发现这是行不通的另一台机器上,我的开发机器上我看到了我的功能LeftMouseClick工作正常,因为它触发“button1”,我正在寻找,并在另一台机器看起来像它不模拟点击,也许它找不到button1的位置或任何://:/// 这里是我的代码:

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 


     relativePoint = this.button1.TransformToAncestor(this) 
          .Transform(new Point(0, 0)); 

     LeftMouseClick((int)relativePoint.X, (int)relativePoint.Y); 

    //restOFcode 
} 
+0

只是一个简单的问题:你为什么要模拟点击?它是专注于文本框?如果是这样,我相信WPF有一个比模拟鼠标点击更好的方法:) –

+0

因为我正在使用触摸屏,并以某种方式在较新的操作系统,如W8.1和W10,它记得最后一步我做到了无论我触摸它不断重复该按钮(按钮我presed),我发现只有取消的方式是当用户注销模拟点击屏幕上的somehwere,这将取消以前的行动 –

+0

这真的很奇怪,从来没有见过类似的东西 –

回答

0

它看起来可以使您正在尝试通过申请初始分配的relativePoint值误差lizer(即在声明中将值设置为类级变量时),如果它调用方法或属性,则不能执行此操作。你应该在这里做的是,在类级别像现在提起申报,但分配它在你的窗体类的构造函数的价值:

public class MyForm : Window 
{ 
    Point relativePoint; 

    public MyForm() 
    { 
     //other code already in the constructor 

     relativePoint = txtPassword.TransformToAncestor(Application.Current.MainWindow) 
        .Transform(new Point(0, 0)); 
    } 
} 

PS:抱歉,如果在类名或继承不作某种意义上说,我不知道什么它应该看起来像为WPF

+0

这帮了我,但现在当我运行的应用程序我面临的错误:指定的视觉不是Visual的祖先。在System.Windows.Media.Visual.TrySimpleTransform ... etc .. hmmm –

+0

我发现问题,在rootVisual我没有通过期待窗口,所以现在它是好的,但我会在一秒钟内测试。 –

+0

对不起,这些帮助不大,那些是WPF的错误,我从来没有使用过WPF。 –

0

使用该线路从窗口

Point locationFromWindow = txtPassword.TranslatePoint(new Point(0, 0), Application.Current.MainWindow); 

获得位置添加此行从屏幕上获得位置

Point locationFromScreen = txtPassword.PointToScreen(locationFromWindow);