2016-02-19 1 views
0

Мне нужно отслеживать состояние отображения любого окна приложения в Windows7. Я пытаюсь выяснить, если какое-либо окно приложения (на основе идентификатора процесса) находится в минимизированном/максимизированном/нормальном состоянии.Как контролировать состояние отображения окна приложения в Windows 7?

Я использую JNA 4.2.1, Java 8 update72 на Windows 7 Enterprise. Любые указатели будут очень полезны. Спасибо заранее всем.

Образец кода, который я пробовал, приведен ниже.

import com.sun.jna.platform.win32.User32; 
import com.sun.jna.platform.win32.WinUser.HOOKPROC; 
import com.sun.jna.platform.win32.WinUser.MSG; 

public class Main{ 
    public static void main(String[] args) { 
     HOOKPROC proc = new HOOKPROC() { 
      public User32.LRESULT callWndRetProc(int nCode, User32.WPARAM wParam, User32.LPARAM lParam) { 
          System.out.println("Recieved window event"); 
       return User32.INSTANCE.CallNextHookEx(null, nCode, wParam, lParam); 
      } 
     }; 
     User32.INSTANCE.SetWindowsHookEx(12, proc, null, 0); 
    } 
} 

ответ

0

Нелегко сделать. Из MSDN:

Если dwThreadId параметр равен нулю или задает идентификатор нити, созданного другим процессом, параметр lpfn должен указать на подключаемую процедуру в DLL. В противном случае lpfn может указывать на крючок в коде, связанном с текущим процессом.

JNA динамически генерирует небольшие биты кода, которые обращаются к Java, и использует их для создания собственных указателей на функции для Java-функций. Однако этот код предполагает, что у вас уже есть JVM и работает, и поскольку они динамически генерируются, они не делают живут в DLL.

Функция обратного вызова SetWindowsHookExдолжна быть быть резидентной, если не в той же теме, что и целевое окно. Чтобы работать с JVM, эта функция DLL-резидентного вызова должна отвечать за запуск JVM, если он еще не запущен. JNA поддерживает поддержку DLL-резидентных обратных вызовов, но, к сожалению, не реализует ни одну из поддерживающих JVM-функций, которые вам нужны, чтобы заставить ее работать на самом деле.

+0

Есть ли какой-либо другой метод из User32 или другой dll, который можно использовать для получения текущего состояния окна? –

+0

Это вопрос, который лучше задать на форуме w32 API. – technomage