none
Получить дескриптор кнопки RRS feed

  • Вопрос

  •  public class MyColorDialog:ColorDialog
     {
      private Button btn; 
      private IntPtr handle;   
      [DllImport("user32.dll")]
      private static extern IntPtr FindWindowEx(IntPtr hWnd, IntPtr hWndChild, string Class, string Window);  
      private bool Set = false;    
      protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
      {
       if (!Set)
       {
       	handle = FindWindowEx(hWnd, IntPtr.Zero, "Button", "ОК");    
        Set = true;
       }
       
       return base.HookProc(hWnd, msg, wparam, lparam);
      }  
     }
    
    Я пытаюсь получить дескриптор кнопки "ОК" в ColorDialog, но переменная handle всегда равна нулю. Что я делаю не так?

    27 июня 2011 г. 19:37

Ответы

  • Посмотрите обсуждение Win32 API: не работает FindWindowEx. С данной функцией могут возникать проблемы, попробуйте один из следующих вариантов для нахождение кнопки:

    1) Установка Set только после успешного поиска:

        bool Set = false;
        IntPtr button;
    
        protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
        {
          if (!Set)
          {
            IntPtr handle = FindWindowEx(hWnd, IntPtr.Zero, "BUTTON", "OK");
            if (handle != IntPtr.Zero)
            {
              Console.WriteLine(handle.ToString("X"));
              Set = true;
            }
          }
    
          return base.HookProc(hWnd, msg, wparam, lparam);
        }
    

    2) Обход всех кнопок и поиск среди них кнопки с нужным текстом:

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
    
        protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
        {
          if (!Set)
          {
            StringBuilder sb = new StringBuilder();
    
            IntPtr handle = FindWindowEx(hWnd, IntPtr.Zero, "BUTTON", null);
            while (handle != IntPtr.Zero)
            {
              GetWindowText(handle, sb, 255);
              if (sb.ToString() == "OK")
              {
                Set = true;
                button = handle;
                break;
              }
              handle = FindWindowEx(hWnd, handle, "BUTTON", null);
            }
          }
          return base.HookProc(hWnd, msg, wparam, lparam);
        }
    

    Оба этих варианта должны работать и находить нужную кнопку.

    PS: В следующий раз лучше будет создать новый топик-вопрос с ссылкой на тему. Спасибо.

     


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 30 июня 2011 г. 11:31
    28 июня 2011 г. 12:40