Как я могу контролировать, какое окно в настоящее время имеет клавиатурный фокус

Вот код вашей проблемы.

My_list = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]]

n=len(My_list)

new_list=[[],[],[],[]]

for i in range(0,n-1,2):
    new_list[i]=My_list[i][:3]+My_list[i+1][3:]
    new_list[i+1]=My_list[i][3:]+My_list[i+1][:3]

print(new_list)
15
задан jmatthias 4 September 2008 в 17:27
поделиться

7 ответов

Таким образом от пути Вы сформулировали вопрос, я вывожу, что Вы хотите иметь обработчик событий, который вызывается каждый раз, когда фокус переключается между окнами. Вы хотите быть уведомленными, вместо того, чтобы иметь необходимость опросить.

я на самом деле не думаю, называя GetFocus от OnIdle, так большая часть взлома - уверенный, что это опрашивает, но это - опрос низких издержек без побочных эффектов - но если Вы действительно хотите отследить это, , Windows Hooks является, вероятно, Вашим лучшим выбором. Конкретно можно установить рычаг CBT (WH_CBT) и прислушаться к уведомлению HCBT_SETFOCUS.

Windows называет рычаг WH_CBT с этим кодом рычага, когда Windows собирается установить фокус на любое окно. В случае определенных для потока рычагов окно должно принадлежать потоку. Если возвраты функции фильтра ПРАВДА, фокус не изменяется.

Вы могли также сделать с с WH_CALLWNDPROC, сцепляются и прислушиваются к сообщению WM_SETFOCUS.

В зависимости от того, делаете ли Вы это глобальным рычагом, или локальный для приложения, можно отследить фокус через все окна в системе или только окна, принадлежавшие процессу.

17
ответ дан 1 December 2019 в 03:05
поделиться

Как насчет Win32 GetForegroundWindow?

3
ответ дан 1 December 2019 в 03:05
поделиться

Существует простой способ использовать.Net Framework 3.5: библиотека Автоматизация UI обеспечивает, фокус события изменился, который запускает каждый раз изменение фокуса в новом управлении.

Страница на Образце MSDN

:

public void SubscribeToFocusChange()
{
    AutomationFocusChangedEventHandler focusHandler 
       = new AutomationFocusChangedEventHandler(OnFocusChanged);
    Automation.AddAutomationFocusChangedEventHandler(focusHandler);
}

private void OnFocusChanged(object src, AutomationFocusChangedEventArgs e)
{
    AutomationElement focusedElement = sender as AutomationElement;
    //...
}

Этот API на самом деле используют рычаг окон негласно, чтобы сделать это. Однако необходимо использовать.Net Framework...

3
ответ дан 1 December 2019 в 03:05
поделиться

Вы могли контролировать сообщения для событие WM_ACTIVATE.

касательно

0
ответ дан 1 December 2019 в 03:05
поделиться

Ну, это не может быть очень корректным..., но можно получить текущий сфокусированное управление довольно легко. Таким образом, Вы могли бы рассмотреть установку таймера, который спрашивает каждую 1/2 приблизительно секунду, "Где текущий фокус?"... Затем можно наблюдать изменения. Код Delphi в качестве примера ниже; должно быть довольно легко адаптироваться, так как реальная работа находится в Windows API calls.

<snip>

function TForm1.GetCurrentHandle: integer;
var
  activeWinHandle: HWND;
  focusedThreadID : DWORD;
begin
  //return the Windows handle of the currently focused control
  Result := 0;
  activeWinHandle := GetForegroundWindow;
  focusedThreadID := GetWindowThreadProcessID(activeWinHandle,nil);
  if AttachThreadInput(GetCurrentThreadID,focusedThreadID,true) then begin
    try
      Result := GetFocus;
    finally
      AttachThreadInput(GetCurrentThreadID, focusedThreadID, false);
    end;
  end;  //if attached
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //give notification if the handle changed
  //(this code gets fired by a timer)
  CurrentHandle := GetCurrentHandle;
  if CurrentHandle <> PreviousHandle then begin
    Label1.Caption := 'Last focus change occurred @ ' + DateTimeToStr(Now);
  end;
  PreviousHandle := CurrentHandle;
end;

<snip>
0
ответ дан 1 December 2019 в 03:05
поделиться

http://msdn.microsoft.com/en-us/library/ms771428.aspx

Has a window focus tracker sample.

0
ответ дан 1 December 2019 в 03:05
поделиться

If you're programming in .net 3.5, the Automation package olorin mentions is by far the easiest, but beware of using it in a program that itself has a UI, at least if the UI is done in WPF -- the focus tracking hooks get confused by events in its own app, and quickly lock up the UI. I sent MS a bug report on it. I have not observed the same problem using a traditional Windows Forms UI. You could, of course, put the tracking code in a separate console app and use some kind of ipc to transmit the info you need.

The tempting alternative of using Interop to access the WH_CBT Windows Hook from C# won't work -- the only global hooks you can get at from C# are the mouse and keyboard.

1
ответ дан 1 December 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: