ご存知かもしれませんが、Mac OS Xには非常に優れた画面ズーム機能が組み込まれており、システム環境設定=>ユニバーサルアクセスで有効にできます。
今、私はこの画面ズームをプログラムでトリガーしようとしています。キーボードショートカットを送信することでそれを行うことができますが、それは可能な限り流動的ではありません。そこで、システムがこれをどのように行うかについて調査しました。
私がやりたいことを実行できるプライベートコアグラフィックスメソッドがいくつかあるようですが、それらがどのような引数を取るかを見つけることができません。
これらは私が見つけた関数です:
- CGSZoomPoint
- CGSUnzoomPoint
- CGSGetZoomParameters
- CGSSetZoomParameters
- CGSIsZoomed
一部の人々は、コアグラフィックフレームワークのプライベートメソッドのいくつかをすでにリバースエンジニアリングし、それらのヘッダーを作成しました。(たとえば、http: //pwproject.googlecode.com/svn/trunk/Mac%20OS%20X/Vector%20Grab/を参照してください)残念ながら、必要と思われるメソッドがありません。(CGSIsZoomed、実際に含まれています
CG_EXTERN CGError CGSIsZoomed(CGSConnectionID cid, bool *outIsZoomed);
)。
画面をズームできるように見えるアプリも見つけました。これは関連する逆アセンブルのようですが、アセンブリについてよく知らないため、読むことができません;-(
0000000100015c21 callq 0x10002c212 ; symbol stub for: _CGEventCreate
0000000100015c26 movq %rax,%rbx
0000000100015c29 movq %rbx,%rdi
0000000100015c2c callq 0x10002c22a ; symbol stub for: _CGEventGetLocation
0000000100015c31 movsd %xmm0,0xffffff48(%rbp)
0000000100015c39 movsd %xmm1,0xffffff58(%rbp)
0000000100015c41 movsd %xmm0,0xa8(%rbp)
0000000100015c46 movsd %xmm1,0xb0(%rbp)
0000000100015c4b movq %rbx,%rdi
0000000100015c4e callq 0x10002c362 ; symbol stub for: _CFRelease
0000000100015c5a jle 0x100015d01
0000000100015c60 movq 0x00098a71(%rip),%rax
0000000100015c67 movq 0x18(%rax),%rcx
0000000100015c6b movq %rcx,0x18(%rsp)
0000000100015c70 movq 0x10(%rax),%rcx
0000000100015c74 movq %rcx,0x10(%rsp)
0000000100015c79 movq (%rax),%rcx
0000000100015c7c movq 0x08(%rax),%rax
0000000100015c80 movq %rax,0x08(%rsp)
0000000100015c85 movq %rcx,(%rsp)
0000000100015c89 movsd 0xffffff48(%rbp),%xmm0
0000000100015c91 movsd 0xffffff58(%rbp),%xmm1
0000000100015c99 callq 0x10002c266 ; symbol stub for: _CGRectContainsPoint
0000000100015c9e cmpl $0x02,0x00098a43(%rip)
0000000100015ca5 jl 0x100015d01
0000000100015ca7 movl $0x 00000001,%r15d
0000000100015cad movl $0x00000020,%ebx
0000000100015cb2 movsd 0xa8(%rbp),%xmm0
0000000100015cb7 movsd 0xb0(%rbp),%xmm1
0000000100015cbc movq 0x00098a15(%rip),%rax
0000000100015cc3 movq 0x18(%rax,%rbx),%rcx
0000000100015cc8 movq %rcx,0x18(%rsp)
0000000100015ccd movq 0x10(%rax,%rbx),%rcx
0000000100015cd2 movq %rcx,0x10(%rsp)
0000000100015cd7 movq (%rax,%rbx),%rcx
0000000100015cdb movq 0x08(%rax,%rbx),%rax
0000000100015ce0 movq %rax,0x08(%rsp)
0000000100015ce5 movq %rcx,(%rsp)
0000000100015ce9 callq 0x10002c266 ; symbol stub for: _CGRectContainsPoint
0000000100015cee addq $0x20,%rbx
0000000100015cf2 incq %r15
0000000100015cf5 movslq 0x000989ec(%rip),%rax
0000000100015cfc cmpq %rax,%r15
0000000100015cff jl 0x100015cb2
0000000100015d01 movsd 0xc0(%rbp),%xmm0
0000000100015d06 movsd %xmm0,0xffffff58(%rbp)
0000000100015d0e leaq 0xa8(%rbp),%rsi
0000000100015d12 leaq 0x98(%rbp),%rdx
0000000100015d16 movl %r14d,%edi
0000000100015d19 callq 0x10002c296 ; symbol stub for: _CGSZoomPoint
0000000100015d1e movsd 0xffffff58(%rbp),%xmm2
0000000100015d26 testl %eax,%eax
0000000100015d28 jne 0x100015d99
0000000100015d2a movapd %xmm2,%xmm0
0000000100015d2e mulsd 0xffffff60(%rbp),%xmm0
0000000100015d36 addsd 0x98(%rbp),%xmm0
0000000100015d3b movsd 0x00017255(%rip),%xmm1
0000000100015d43 ucomisd %xmm0,%xmm1
0000000100015d47 ja 0x100015d78
0000000100015d49 ucomisd 0x0001749f(%rip),%xmm0
0000000100015d51 ja 0x100015d78
0000000100015d53 mulsd 0xffffff50(%rbp),%xmm2
0000000100015d5b addsd 0xa0(%rbp),%xmm2
0000000100015d60 movsd 0x00017230(%rip),%xmm0
0000000100015d68 ucomisd %xmm2,%xmm0
0000000100015d6c ja 0x100015d78
0000000100015d6e ucomisd 0x00017482(%rip),%xmm2
0000000100015d76 jbe 0x100015d99
0000000100015d78 movzbl 0xbf(%rbp),%edx
0000000100015d7c andl $0x01,%edx
0000000100015d7f movsd 0xc0(%rbp),%xmm0
0000000100015d84 leaq 0xc8(%rbp),%rsi
0000000100015d88 movl %r14d,%edi
0000000100015d8b movl $0x 00000001,%ecx
0000000100015d90 xorpd %xmm1,%xmm1
0000000100015d94 callq 0x10002c290 ; symbol stub for: _CGSSetZoomParameters
0000000100015d99 movsd 0xffffff70(%rbp),%xmm1
0000000100015da1 addsd 0xffffff50(%rbp),%xmm1
0000000100015da9 movsd 0xffffff68(%rbp),%xmm0
0000000100015db1 addsd 0xffffff60(%rbp),%xmm0
0000000100015db9 movb 0x000988f1(%rip),%al
0000000100015dbf xorl %edi,%edi
0000000100015dc1 cmpb $0x01,%al
0000000100015dc3 jne 0x100015dde
0000000100015dc5 movl $0x 00000006,%esi
0000000100015dca xorl %edx,%edx
誰かがそれらのプライベート関数を使用する方法を知っているなら、あなたは私の週を作るでしょう:-)
最高、トーマス