2016-08-18 54 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);