Дескриптор HWND, возвращаемый через FindWindowW, отличается от родительского элемента верхнего уровня - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать утилиту, которая будет выборочно скрывать и показывать окна на основе предварительно назначенных горячих клавиш, и я работаю с кодом API Windows.

Я использую вызов FindWindowW, чтобы получить дескриптор окна в качестве теста (в моем случае это окно с текстом «Калькулятор - Калькулятор», которое соответствует открытому окну калькулятора), и использую этот дескриптор вФункция ShowWindow.

Код ниже:

    var user32path = 'C:\\Windows\\System32\\user32.dll';


        function TEXT(text){
          return new Buffer(text, 'ucs2').toString('binary');
        }

          var user32 = new FFI.Library(user32path, {
        'FindWindowW': ['int', ['string', 'string']],
        'ShowWindow': ['int', ['int', 'int']],
        'ShowWindowAsync': ['int', ['int', 'int']],
        'FindWindowExW': ['int', ['int', 'int', 'string', 'string']],
        'BringWindowToTop': ['int', ['int']],
        'GetActiveWindow': ['int', ['int']]


        var handle = user32.FindWindowW(null,TEXT("Calculator ‎- Calculator"));

user32.ShowWindow(

handle, 'SW_Hide');

//associatedWindowHandle is a manually-created variable with the Spy++ variable.
//The Spy++ doesn't match and I'm not sure why. 


user32.ShowWindowAsync(activeHandle, 'SW_Hide');

var pruneLength = Object.keys(prunedData).length;

  for (let i = 0; i < pruneLength-1; i++){
    if (Object.entries(prunedData)[i][1] === hotkey){
      for(let j = 1; j <= prunedData.assocWindows.length; j++){

        let associatedWindow = Object.entries(prunedData)[i+1][j].toString();
          let associatedWindowHandle = parseInt(associatedWindow);
        user32.ShowWindowAsync(associatedWindowHandle, 'SW_Hide');
        user32.BringWindowToTop(associatedWindowHandle[i+1][j]);
      }
    }
  }

2 основных вопроса:

  1. Когда я пытаюсь скрыть и / или свернуть открытое окно калькулятора, я могу 'Похоже, чтобы показать это снова при нажатии на него.изображение предварительного просмотра разочаровывает, и я замечаю, что «Process Broker» выброшен.

  2. Я не могу найти дескриптор окна, предоставляемый такими инструментами, как Spy ++, что затрудняет отладку, чтобы узнать, нужно ли мне получить другой дескриптор.Дескриптор окна калькулятора родительского уровня, кажется, не совпадает, и я убедился, что это тот же инструмент.

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

Большое спасибо!

1 Ответ

0 голосов
/ 31 мая 2018

Во-первых, я бы повторил замечания Ханса Пассанта о том, что вам, вероятно, лучше не пытаться делать это с помощью приложения UWP, такого как Calculator, но с другой стороны, эти приложения не исчезнут, поэтому, возможно, вы захотите попробовать в любом случае.

Похоже, что оболочка не ценит то, что вы пытаетесь скрыть приложение UWP (хотя приложения Win32 работают нормально, см. Рисунок).Как вы уже заметили, его значок остается видимым на панели инструментов, но ведет себя странно, когда окно скрыто.Итак, короткая версия, не делайте этого.

Вместо этого попробуйте это:

PostMessage (hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);

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

Что касается Spy ++, у меня нет проблем с поиском окна верхнего уровня приложения UWP с помощью «Finder tool» (Меню -> Поиск -> Найти окно).Вам просто нужно пройти несколько уровней вверх по иерархии окон, пока не дойдете до того, который вам действительно нужен.

Spy ++, похоже, не может регистрировать сообщения, отправляемые в такое окно, однако, смотрите (бесстыдно)plug): Почему Spy ++ не может видеть сообщения, отправленные в приложения UWP? .Я планирую разобраться в этом немного больше, когда у меня будет время.

Наконец, что вы подразумеваете под словом «Process Broker», пожалуйста?Я не понимаю этот комментарий.Есть что-то под названием RuntimeBroker , которое отображается в Process Explorer и, похоже, каким-то образом связано с приложениями UWP, но я не знаю, имеете ли вы это в виду, и я ничего об этом не знаюдаже если ты сделал.

...