В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
Я вырыл через исходный код Совместных действий для нахождения вызова, который генерирует события от нажатия мыши:
#include <ApplicationServices/ApplicationServices.h>
int to(int x, int y)
{
CGPoint newloc;
CGEventRef eventRef;
newloc.x = x;
newloc.y = y;
eventRef = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, newloc,
kCGMouseButtonCenter);
//Apparently, a bug in xcode requires this next line
CGEventSetType(eventRef, kCGEventMouseMoved);
CGEventPost(kCGSessionEventTap, eventRef);
CFRelease(eventRef);
return 0;
}
Теперь для записи привязки Python!
Просто попробуйте этот код:
#!/usr/bin/python
import objc
class ETMouse():
def setMousePosition(self, x, y):
bndl = objc.loadBundle('CoreGraphics', globals(),
'/System/Library/Frameworks/ApplicationServices.framework')
objc.loadBundleFunctions(bndl, globals(),
[('CGWarpMouseCursorPosition', 'v{CGPoint=ff}')])
CGWarpMouseCursorPosition((x, y))
if __name__ == "__main__":
et = ETMouse()
et.setMousePosition(200, 200)
это работает у леопарда OSX 10.5.6
Когда я хотел сделать это, я установил Jython и использовал java.awt.Robot
класс. Если необходимо сделать сценарий CPython, это, очевидно, не подходит, но когда Вы гибкость для выбора чего-либо это - хорошее межплатформенное решение.
import java.awt
robot = java.awt.Robot()
robot.mouseMove(x, y)
robot.mousePress(java.awt.event.InputEvent.BUTTON1_MASK)
robot.mouseRelease(java.awt.event.InputEvent.BUTTON1_MASK)
Сценарий python из geekorgy.com великолепен, за исключением того, что я столкнулся с несколькими трудностями, поскольку я установил более новую версию python. Итак, вот несколько советов для тех, кто может искать решение.
Если вы установили Python 2.7 на Mac OS 10.6, у вас есть несколько вариантов получения python для импорта из Quartz.CoreGraphics:
A) В терминале введите python2.6
вместо python
перед путем к сценарию
B) Вы можете установить PyObjC , выполнив следующие действия:
which python
и скопируйте путь вверх через 2.7
Затем введите easy_install –-prefix /Path/To/Python/Version pyobjc==2.3
** т.е. easy_install –-prefix /Library/Frameworks/Python.framework/Versions/2.7 pyobjc==2.3
import objc
вверху Если easy_install не работает в первый раз, вам может понадобиться сначала установить ядро:
** т.е. easy_install --prefix /Library/Frameworks/Python.framework/Versions/2.7 pyobjc-core==2.3
C) Вы можете сбросить ваш путь Python на исходный питон Mac OS:
defaults write com.apple.versioner.python Version 2.6
*** Кроме того, быстрый способ узнать координаты (x, y) на экране:
Command+Shift+4
(выбор экрана) Используйте CoreGraphics
из библиотеки Quartz, например:
from Quartz.CoreGraphics import CGEventCreate
from Quartz.CoreGraphics import CGEventGetLocation
ourEvent = CGEventCreate(None);
currentpos = CGEventGetLocation(ourEvent);
mousemove(currentpos.x,currentpos.y)
Источник: Тони комментарий на странице Geekorgy . Sup>
Самый легкий путь? Скомпилируйте этот приложение Какао и передайте его Ваши движения мыши.
Вот код:
// File:
// click.m
//
// Compile with:
// gcc -o click click.m -framework ApplicationServices -framework Foundation
//
// Usage:
// ./click -x pixels -y pixels
// At the given coordinates it will click and release.
#import <Foundation/Foundation.h>
#import <ApplicationServices/ApplicationServices.h>
int main(int argc, char **argv) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSUserDefaults *args = [NSUserDefaults standardUserDefaults];
// grabs command line arguments -x and -y
//
int x = [args integerForKey:@"x"];
int y = [args integerForKey:@"y"];
// The data structure CGPoint represents a point in a two-dimensional
// coordinate system. Here, X and Y distance from upper left, in pixels.
//
CGPoint pt;
pt.x = x;
pt.y = y;
// https://stackoverflow.com/questions/1483567/cgpostmouseevent-replacement-on-snow-leopard
CGEventRef theEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, pt, kCGMouseButtonLeft);
CGEventSetType(theEvent, kCGEventLeftMouseDown);
CGEventPost(kCGHIDEventTap, theEvent);
CFRelease(theEvent);
[pool release];
return 0;
}
<час>Приложение назвало щелчок, который вызывает CGPostMouseEvent от заголовочного файла CGRemoteOperation.h. Это берет координаты в качестве параметров командной строки, перемещает мышь в то положение, затем нажимает и отпускает кнопку мыши.
Сохраняют вышеупомянутый код как click.m, открывают Terminal и переключаются на папку, где Вы сохранили источник. Тогда скомпилируйте программу путем ввода
gcc -o click click.m -framework ApplicationServices -framework Foundation
. Не запугивайтесь путем необходимости скомпилировать это, поскольку существует больше комментариев, чем код. Это - очень короткая программа, которая делает одну простую задачу.
Иначе? Импорт pyobjc, чтобы получить доступ к части платформы OSX и получить доступ к мыши тот путь. (см. код от первого примера для идей).