Добрый день,
Я некоторое время использовал JNA для взаимодействия с Windows API, и теперь я застрял при создании окна. Насколько я сделал следующее:
1. Создали дочернее окно существующего окна и получили действительный обработчик для него.
2. Понял, что каждое окно в Windows имеет непрерывный цикл отправки сообщений.
3. Понял, что лучший способ включить мое окно в цикл отправки сообщений - это использовать что-то вроде следующего кода (не мой, но это то, что я бы тоже сделал):
final LONG_PTR prevWndProc = new LONG_PTR(User32.INSTANCE.GetWindowLong(hwnd, User32.GWL_WNDPROC)); //this is to obtain a pointer to the WNDPROC of the parent window, which we are going to need later
wndProcCallbackListener = new WndProcCallbackListener()
{
public LRESULT callback(HWND hWnd, int uMsg, WPARAM uParam, LPARAM lParam)
{
if (uMsg == WTSAPI.WM_POWERBROADCAST)
{
System.out.println("WM_POWERBROADCAST Event: hWnd="+hwnd+", uMsg="+uMsg+", uParam="+uParam+", lParam="+lParam);
}
else if (uMsg == WTSAPI.WTS_SESSION_CHANGE)
{
System.out.println("WTS_SESSION_CHANGE Event: hWnd="+hwnd+", uMsg="+uMsg+", uParam="+uParam+", lParam="+lParam);
}
//Call the window's actual WndProc so the events get processed.
return User32.INSTANCE.CallWindowProc(prevWndProc, hWnd, uMsg, uParam, lParam);
}
};
//Set the WndProc function to use our callback listener instead of the window's one.
int result = User32.INSTANCE.SetWindowLong(hwnd, User32.GWL_WNDPROC, wndProcCallbackListener);
Однако моя проблема заключается в том, что я вызываю GetWindowLong () для родительского окна (моя первая строка кода) Я получаю 0 для указателя, который указывает, что функция не завершилась успешно. Последующий вызов GetLastError () и быстрая проверка кодов ошибок дают мне ошибку «Отказано в доступе» . Это, конечно, логично, поскольку я пытаюсь из своего собственного потока получить доступ к адресу WNDPROC другого, но мне было интересно, есть ли способ (конечно, должен быть) обойти это.
Есть указатели? (каламбур)