2012-04-20 1 views
1

Приведенный ниже код выполняет следующиеUSER32.dll SetFocus завершается с ошибкой Win32 5: отказано в доступе

PushWindowToFront():

  • получает текущий идентификатор процесса для справки позже
  • звонки user32. функция длл EnumWindows с обратным вызовом EnumWindowsCallback метод
  • EnumWindows затем перебирает каждого окна и вызывает функцию обратного вызова для каждого

Callback:

  • Проверьте процесс резьбы окна идентификатор совпадает с текущей идентификатор процесса
  • если да, то проверьте, если текст окна начинается «Выберите»
  • если да, то звоните user32.dll функционировать SetFocus на оконной ручке
  • проверка & печати ошибка последнего win32

Однако он всегда возвращает ошибку win32 5 - «Доступ запрещен». Почему приложение не имеет доступа к вызову этой функции для окна, принадлежащего к тому же процессу?

.

public void PushWindowToFront() 
    { 
     currentProcessId = System.Diagnostics.Process.GetCurrentProcess().Id; 

     Win32Methods.EnumWindowsCallbackDelegate callback = new Win32Methods.EnumWindowsCallbackDelegate(this.EnumWindowsCallback); 

     Win32Methods.EnumWindows(callback, (IntPtr) 0); 
    } 

    public bool EnumWindowsCallback(IntPtr hWnd, IntPtr lParam) 
    { 
     uint i = 0; 

     Win32Methods.GetWindowThreadProcessId(hWnd, out i); 

     if (currentProcessId == i) 
     { 

      StringBuilder sb = new StringBuilder(512); 

      Win32Methods.GetWindowText(hWnd, sb, sb.Capacity); 

      if (sb.ToString().Split(' ')[0].ToLower().Equals("select")) 
      { 
       IntPtr result = Win32Methods.SetFocus(hWnd); 
       Console.WriteLine("Window found: {0}\r\nSetting focus...\r\nResult: {1}\r\nLastError: {2}", 
        sb.ToString(), result, Marshal.GetLastWin32Error().ToString()); 
      } 
     } 

     return true; 
    } 
+0

Какова ценность 'результата'? –

+0

Значение @David результата равно 0 – Richard

+1

Поток имеет значение, а окно принадлежит потоку, который его создал. –

ответ

2

Я получил эту точную ситуацию; я понимаю, что «SetFocus» является виновником. Я разрешил ошибку, заменив «SetFocus» на «SetForegroundWindow»

hwnd = win32gui.FindWindow(None, winName) 
win32gui.SetForegroundWindow(hwnd)