2016-07-08 13 views
2

ボタンのプロパティを取得しようとしていますが、spy ++のウィンドウツールをドラッグすると、ボタン(その場合は「iniciargravação」)しかし、このような、むしろボタングリッド親、:QtアプリケーションでSpy ++がボタンに到達しない

enter image description here

なぜそれがあるとどのように私は、ボタンのプロパティを取得できますか?私はそれの情報ツールを自動でしようとしたが、私は同じ動作を取得します。このように使用して

public class WindowHandleInfo 
    { 
     private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam); 

     [DllImport("user32")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam); 

     private IntPtr _MainHandle; 

     public WindowHandleInfo(IntPtr handle) 
     { 
      this._MainHandle = handle; 
     } 

     public List<IntPtr> GetAllChildHandles() 
     { 
      List<IntPtr> childHandles = new List<IntPtr>(); 

      GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles); 
      IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList); 

      try 
      { 
       EnumWindowProc childProc = new EnumWindowProc(EnumWindow); 
       EnumChildWindows(this._MainHandle, childProc, pointerChildHandlesList); 
      } 
      finally 
      { 
       gcChildhandlesList.Free(); 
      } 

      return childHandles; 
     } 

     private bool EnumWindow(IntPtr hWnd, IntPtr lParam) 
     { 
      GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam); 

      if (gcChildhandlesList == null || gcChildhandlesList.Target == null) 
      { 
       return false; 
      } 

      List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>; 
      childHandles.Add(hWnd); 

      return true; 
     } 
    } 


void printWindows(IntPtr parent, int tabLevel) 
     { 
      var w = new WindowHandleInfo(parent); 
      foreach (IntPtr h in w.GetAllChildHandles()) 
      { 
       string caption = GetTextBoxText(h) ?? "not found"; 
       Debug.Write(new string('\t', tabLevel)); 
       Debug.WriteLine(caption); 
       printWindows(h, tabLevel + 1); 
      } 
     } 

int GetTextBoxTextLength(IntPtr hTextBox) 
     { 
      // helper for GetTextBoxText 
      const int WM_GETTEXTLENGTH = 0x000E; 
      int result = SendMessage(hTextBox, WM_GETTEXTLENGTH, 0, IntPtr.Zero); 
      return result; 
     } 

     string GetTextBoxText(IntPtr hTextBox) 
     { 
      const int WM_GETTEXT = 0x000D; 
      int len = GetTextBoxTextLength(hTextBox); 
      if (len <= 0) return null; // no text 
      StringBuilder sb = new StringBuilder(len + 1); 
      SendMessage(hTextBox, WM_GETTEXT, len + 1, sb); 
      return sb.ToString(); 
     } 

は、私はこのように、C#コードから、そのボタンのプロパティを取得しようとした

IntPtr parent = FindWindow(IntPtr.Zero, "my app title"); 
printWindows(parent, 0); 

しかし、私はIniciarはボタンをgravaçãoに関連anyhingを見ることができません。

+0

本当にボタンですか?描くことができますか? –

+0

@ DanielAWhite私は分かりません。どのように私は確かに知ることができますか?私はアプリケーションがQtインターフェイスを使ってビルドされていることを知っています。もしも問題があれば... – user834697

+0

他のツールのようなWindowsインスペクタは、spy ++/autoと同じ動作をしますinfo tool – user834697

答えて

6

QtのUIコントロール(Qtの辞書にウィジェット、赤ボタン、ライン編集、コンボボックスなど)がネイティブコントロールによってバックアップされていません。彼らはネイティブUIのルックアンドフィールを盗み、それを模倣します。

これらのコントロールは、これらの「スパイ」ツールのいくつかを使用しているわけではありませんが、アクセシビリティによって検索できます(*)。

また、デバッグにはGammaRay、UIテストにはSquishなど、他のQt固有のツールを使用してアプリケーションを検査できます。

(*)Qtに付属するコントロールはアクセス可能ですが、はボタンのように見えるものを手作業で再実装してアクセシビリティを提供していない場合、

+0

Windows用のGammaRayプレビルドバイナリが表示されません。私は本当にそれを自分でコンパイルする必要がありますか? Squishがリクエストを処理しています.24時間以内に結果を取得します。他の代替ツールはありますか?私の目標は、ネイティブコントロールの 'SendMessage(btn、BN_CLICKED、0、IntPtr.Zero);に相当するアプリケーションにクリックメッセージを送信することです。 – user834697

+0

しかし、もし私が尋ねることができたら、どんな目的のために?スクリプトですか?デバッグ? (とにかく、答えは「はい」です。あなたは今のところそれをコンパイルする必要があります。) – peppe

+0

オートメーション。このアプリケーションは自分でできないことをしているので、外部アプリケーションを使用して設定ファイルを設定して制御し、ボタンを押して処理を開始します。私はどんな種類のウイルスも作りません。 – user834697

関連する問題