|
|
2014/4/26(Sat) 10:25:56|NO.61691
右クリックメニューで同等な物が出てきますが、
最初から表示させたいと言うことですか?
|
|
2014/4/29(Tue) 14:00:15|NO.61751
選択範囲の位置は取得できませんが、
選択後のカーソル座標と、文字列を取得するサンプルを書いてみました。
#include "kernel32.as"
#include "user32.as"
#define global TRUE 1
#define global FALSE 0
#define global NULL 0
// キーボード押下モジュール
#module "m_pushKeyboard"
#define VK_CONTROL 0x0011
#define VK_A 0x0041
#define VK_C 0x0043
#define VK_V 0x0056
#define VK_X 0x0058
#define INPUT_KEYBOARD 1
#define KEYEVENTF_KEYDOWN 0x0000
#define KEYEVENTF_EXTENDEDKEY 0x0001
#define KEYEVENTF_KEYUP 0x0002
#define KEYEVENTF_SCANCODE 0x0008
#define MAPVK_VK_TO_VSC 0
#define MAPVK_VSC_TO_VK 1
#define MAPVK_VK_TO_CHAR 2
#define SIZE_OF_INT 4
#define INPUT_KEYBOARD_LENGTH 7
#const INPUT_KEYBOARD_SIZE SIZE_OF_INT * INPUT_KEYBOARD_LENGTH
#define LENGTH_2 2
#define LENGTH_4 4
#enum type = 0
#enum dwVkAndWScan
#enum dwFlags
// キーを押す
#deffunc setPushKeyboard var KEYBDINPUT, int scancode
sdim KEYBDINPUT, INPUT_KEYBOARD_SIZE * LENGTH_2
dupptr INPUT_1, varptr(KEYBDINPUT) + INPUT_KEYBOARD_SIZE * 0 , INPUT_KEYBOARD_SIZE, vartype("int")
dupptr INPUT_2, varptr(KEYBDINPUT) + INPUT_KEYBOARD_SIZE * 1 , INPUT_KEYBOARD_SIZE, vartype("int")
INPUT_1.type = INPUT_KEYBOARD
INPUT_1.dwVkAndWScan = scancode << 16
INPUT_1.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYDOWN
INPUT_2.type = INPUT_KEYBOARD
INPUT_2.dwVkAndWScan = scancode << 16
INPUT_2.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP
return
// Ctrlを押しながらキーを押す
#deffunc setPushKeyboardCtrl var KEYBDINPUT, int scancode
sdim KEYBDINPUT, INPUT_KEYBOARD_SIZE * LENGTH_4
dupptr INPUT_1, varptr(KEYBDINPUT) + INPUT_KEYBOARD_SIZE * 0 , INPUT_KEYBOARD_SIZE, vartype("int")
dupptr INPUT_2, varptr(KEYBDINPUT) + INPUT_KEYBOARD_SIZE * 1 , INPUT_KEYBOARD_SIZE, vartype("int")
dupptr INPUT_3, varptr(KEYBDINPUT) + INPUT_KEYBOARD_SIZE * 2 , INPUT_KEYBOARD_SIZE, vartype("int")
dupptr INPUT_4, varptr(KEYBDINPUT) + INPUT_KEYBOARD_SIZE * 3 , INPUT_KEYBOARD_SIZE, vartype("int")
INPUT_1.type = INPUT_KEYBOARD
INPUT_1.dwVkAndWScan = scancode_control << 16
INPUT_1.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYDOWN
INPUT_2.type = INPUT_KEYBOARD
INPUT_2.dwVkAndWScan = scancode << 16
INPUT_2.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYDOWN
INPUT_3.type = INPUT_KEYBOARD
INPUT_3.dwVkAndWScan = scancode << 16
INPUT_3.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP
INPUT_4.type = INPUT_KEYBOARD
INPUT_4.dwVkAndWScan = scancode_control << 16
INPUT_4.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP
return
// 初期化
#deffunc initPushCopy
MapVirtualKey VK_CONTROL, MAPVK_VK_TO_VSC
scancode_control = stat
MapVirtualKey VK_A, MAPVK_VK_TO_VSC
scancode_a = stat
MapVirtualKey VK_C, MAPVK_VK_TO_VSC
scancode_c = stat
MapVirtualKey VK_V, MAPVK_VK_TO_VSC
scancode_v = stat
MapVirtualKey VK_X, MAPVK_VK_TO_VSC
scancode_x = stat
setPushKeyboard INPUT_KEYBDINPUT_A, scancode_a
setPushKeyboardCtrl INPUT_KEYBDINPUT_CTRL_A, scancode_a
setPushKeyboard INPUT_KEYBDINPUT_C, scancode_c
setPushKeyboardCtrl INPUT_KEYBDINPUT_CTRL_C, scancode_c
setPushKeyboard INPUT_KEYBDINPUT_V, scancode_v
setPushKeyboardCtrl INPUT_KEYBDINPUT_CTRL_V, scancode_v
setPushKeyboard INPUT_KEYBDINPUT_X, scancode_x
setPushKeyboardCtrl INPUT_KEYBDINPUT_CTRL_X, scancode_x
return
// すべて選択
#deffunc pushAll
getkey is_push_ctrl, VK_CONTROL
if(is_push_ctrl) {
SendInput LENGTH_2, varptr(INPUT_KEYBDINPUT_A), INPUT_KEYBOARD_SIZE
} else {
SendInput LENGTH_4, varptr(INPUT_KEYBDINPUT_CTRL_A), INPUT_KEYBOARD_SIZE
}
return
// コピー
#deffunc pushCopy
getkey is_push_ctrl, VK_CONTROL
if(is_push_ctrl) {
SendInput LENGTH_2, varptr(INPUT_KEYBDINPUT_C), INPUT_KEYBOARD_SIZE
} else {
SendInput LENGTH_4, varptr(INPUT_KEYBDINPUT_CTRL_C), INPUT_KEYBOARD_SIZE
}
return
// ペースト
#deffunc pushPaste
getkey is_push_ctrl, VK_CONTROL
if(is_push_ctrl) {
SendInput LENGTH_2, varptr(INPUT_KEYBDINPUT_V), INPUT_KEYBOARD_SIZE
} else {
SendInput LENGTH_4, varptr(INPUT_KEYBDINPUT_CTRL_V), INPUT_KEYBOARD_SIZE
}
return
// カット
#deffunc pushCut
getkey is_push_ctrl, VK_CONTROL
if(is_push_ctrl) {
SendInput LENGTH_2, varptr(INPUT_KEYBDINPUT_X), INPUT_KEYBOARD_SIZE
} else {
SendInput LENGTH_4, varptr(INPUT_KEYBDINPUT_CTRL_X), INPUT_KEYBOARD_SIZE
}
return
#global
initPushCopy
// マウスの入力イベントモジュール
#module "m_MouseEvent"
#define VM_MOUSE_LEFT 1
#define VM_MOUSE_RIGHT 2
// ラベルをセットする
#define global setMouseDown(%1) label_mousedown@m_MouseEvent = %1
#define global setMouseUp(%1) label_mouseup@m_MouseEvent = %1
// 初期化
#deffunc initMouseEvent
mouse_code = VM_MOUSE_LEFT
is_mouse_down = FALSE
return
// マウスのチェック
#deffunc checkMouseEvent
getkey is_push, mouse_code
if(is_mouse_down) {
if(is_push == FALSE) {
is_mouse_down = FALSE
gosub label_mouseup
}
} else {
if(is_push) {
is_mouse_down = TRUE
gosub label_mousedown
}
}
return
#global
initMouseEvent
// クリップボード操作モジュール
#module "m_Clipboard"
#define GMEM_FIXED 0
// クリップボードに入っているもの一覧(参考)
// http://msdn.microsoft.com/en-us/library/windows/desktop/ff729168(v=vs.85).aspx
#define CF_TEXT 1
#define CF_BITMAP 2
#define CF_METAFILEPICT 3
#define CF_SYLK 4
#define CF_DIF 5
#define CF_TIFF 6
#define CF_OEMTEXT 7
#define CF_DIB 8
#define CF_PALETTE 9
#define CF_PENDATA 10
#define CF_RIFF 11
#define CF_WAVE 12
#define CF_UNICODETEXT 13
#define CF_ENHMETAFILE 14
#define CF_HDROP 15
#define CF_LOCALE 16
#define CF_DIBV5 17
#define CF_OWNERDISPLAY 0x0080
#define CF_DSPTEXT 0x0081
#define CF_DSPBITMAP 0x0082
#define CF_DSPMETAFILEPICT 0x0083
#define CF_DSPENHMETAFILE 0x008E
#define CF_PRIVATEFIRST 0x0200
#define CF_PRIVATELAST 0x02FF
#define CF_GDIOBJFIRST 0x0300
#define CF_GDIOBJLAST 0x03FF
// 初期化
#deffunc initClipboard
clipboard_list_memorysize = 16 * 1024 * 1024 // クリップボード最大サイズ
clipboard_list_maxlength = 32 // クリップボード最大長
sdim clipboard_list_buffer, clipboard_list_memorysize
format_list_length = 0
dim clipboard_list_format, clipboard_list_maxlength
dim clipboard_list_offset, clipboard_list_maxlength + 1
dim clipboard_list_size, clipboard_list_maxlength
is_backup = FALSE
return
// クリップボードのバックアップをとる
#deffunc backupClipboard
is_backuped = FALSE
// クリップボードを開ける
OpenClipboard 0
if(stat == 0) {
return(FALSE)
}
// クリップボードに入っている数を取得
CountClipboardFormats
format_list_length = stat
// バッファオーバーチェック
if(format_list_length >= clipboard_list_maxlength) {
CloseClipboard
return(FALSE)
}
// クリップボードのフォーマットを取得
format = 0
repeat format_list_length
EnumClipboardFormats format
format = stat
clipboard_list_format(cnt) = format
loop
// クリップボードの全体のサイズを取得する
clipboard_size = 0
offset = 0
repeat format_list_length
GetClipboardData clipboard_list_format(cnt) // クリップボードを取得
clipboard_handle = stat
GlobalLock clipboard_handle // ロックをかける
clipboard_address = stat
GlobalSize clipboard_address // サイズを取得する
size = stat
clipboard_size = clipboard_size + size
clipboard_list_size(cnt) = size
clipboard_list_offset(cnt) = offset
GlobalUnlock clipboard_handle // ロックの解除
offset += size
loop
if(clipboard_size >= clipboard_list_memorysize) {
CloseClipboard
return(FALSE)
}
// クリップボードのデータを吸い出す
offset = 0
repeat format_list_length
GetClipboardData clipboard_list_format(cnt)
clipboard_handle = stat
GlobalLock clipboard_handle
clipboard_address = stat
if(clipboard_list_size(cnt) > 0) {
dupptr clipboard_data, clipboard_address, clipboard_list_size(cnt)
memcpy clipboard_list_buffer, clipboard_data, clipboard_list_size(cnt), clipboard_list_offset(cnt), 0
}
GlobalUnlock clipboard_handle
loop
CloseClipboard
is_backuped = TRUE
return(TRUE)
// クリップボードを復元する
#deffunc recoveryClipboard
if(is_backuped == FALSE) {
return(FALSE)
}
// クリップボードを開ける
OpenClipboard 0
if(stat == 0) {
return(FALSE)
}
EmptyClipboard
repeat format_list_length
// メモリを確保
GlobalAlloc GMEM_FIXED, clipboard_list_size(cnt)
clipboard_address = stat
// データのコピー
if(clipboard_list_size(cnt) > 0) {
dupptr clipboard_data, clipboard_address, clipboard_list_size(cnt)
memcpy clipboard_data, clipboard_list_buffer, clipboard_list_size(cnt), 0, clipboard_list_offset(cnt)
}
// クリップボードにセットする
SetClipboardData clipboard_list_format(cnt), clipboard_address
loop
CloseClipboard
return(TRUE)
// クリップボードのテキストを取得する
#deffunc getTextFromClipboard
IsClipboardFormatAvailable CF_TEXT
if(stat == 0) {
return("")
}
OpenClipboard 0
if(stat == 0) {
return("")
}
// クリップボードを開ける
GetClipboardData CF_TEXT
clipboard_handle = stat
// メモリのロック
GlobalLock clipboard_handle
clipboard_address = stat
// ファイルサイズを取得
GlobalSize clipboard_address
size = stat
sdim text, size
dupptr clipboard_data, clipboard_address, size
memcpy text, clipboard_data, size, 0, 0
GlobalUnlock clipboard_handle
CloseClipboard
return(text)
#global
initClipboard
#module "m_Caret"
#const SIZE_OF_INT 4
#const LENGTH_OF_RECT 4
#const LENGTH_OF_GUITHREADINFO (8 + LENGTH_OF_RECT)
#const SIZE_OF_GUITHREADINFO (LENGTH_OF_GUITHREADINFO * SIZE_OF_INT)
#define GUI_CARETBLINKING 0x00000001
#define GUI_INMOVESIZE 0x00000002
#define GUI_INMENUMODE 0x00000004
#define GUI_SYSTEMMENUMODE 0x00000008
#define GUI_POPUPMENUMODE 0x00000010
#enum cbSize = 0
#enum flags
#enum hwndActive
#enum hwndFocus
#enum hwndCapture
#enum hwndMenuOwner
#enum hwndMoveSize
#enum hwndCaret
#enum rcCaretLeft
#enum rcCaretTop
#enum rcCaretRight
#enum rcCaretBottom
#const LENGTH_OF_CURSORINFO 5
#const SIZE_OF_CURSORINFO (LENGTH_OF_CURSORINFO * SIZE_OF_INT)
#define CURSOR_SHOWING 0x00000001
#define CURSOR_SUPPRESSED 0x00000002
#define hCursor 2
#define IDC_IBEAM 32513
// キャレットのカーソルになっているかどうか
#deffunc checkIsCaretCursor
dim CURSORINFO, LENGTH_OF_CURSORINFO
CURSORINFO.cbSize = SIZE_OF_CURSORINFO
GetCursorInfo varptr(CURSORINFO)
if((CURSORINFO.flags & CURSOR_SHOWING) == 0) {
return(FALSE)
}
LoadCursor NULL, IDC_IBEAM
return(stat == CURSORINFO.hCursor)
// カーソルの状態を記録する
#deffunc doMouseDownForCaret
checkIsCaretCursor
is_caret_cursor = stat
return
// カーソル座標を取得します
#deffunc getCaretPosition array CARETRECT
dim GUITHREADINFO, LENGTH_OF_GUITHREADINFO
GUITHREADINFO.cbSize = SIZE_OF_GUITHREADINFO
GetGUIThreadInfo NULL, varptr(GUITHREADINFO)
dim CARETRECT, 4
if((GUITHREADINFO.flags & GUI_CARETBLINKING) == 0) {
if(is_caret_cursor) {
// 位置を取得できないのでマウスの座標のみ返す
GetCursorPos varptr(CARETRECT)
CARETRECT(2) = CARETRECT(0)
CARETRECT(3) = CARETRECT(1)
return(TRUE)
} else {
return(FALSE)
}
}
CARETRECT(0) = GUITHREADINFO.rcCaretLeft
CARETRECT(1) = GUITHREADINFO.rcCaretTop
CARETRECT(2) = GUITHREADINFO.rcCaretRight
CARETRECT(3) = GUITHREADINFO.rcCaretBottom
ClientToScreen GUITHREADINFO.hwndCaret, varptr(CARETRECT)
ClientToScreen GUITHREADINFO.hwndCaret, varptr(CARETRECT) + 8
return(TRUE)
// 選択中のテキストを取得します
#deffunc getSelectedText
backupClipboard // クリップボードのバックアップ
if(stat == FALSE) {
return ""
}
getTextFromClipboard // 現在のクリップボードを記録
text_backup = refstr
pushCopy // コピー
sleep 10
getTextFromClipboard // コピー後のクリップボードを記録
text_new = refstr
recoveryClipboard // クリップボードのリカバリー
if(text_backup == text_new) { // 前回と記録が異なっていなければ取得無し
return ""
}
return text
#global
gsel 0,2
// ラベルを設定
setMouseUp *onMouseUp
setMouseDown *onMouseDown
// 監視
repeat
await 10
checkMouseEvent
loop
*onMouseDown
doMouseDownForCaret
return
// クリック
*onMouseUp
redraw 0
color 255,255,255
boxf
color
pos 0,0
getSelectedText
if(refstr != "") {
mes "選択「"+refstr+"」"
}
getCaretPosition rect
if(stat) {
mes "キャレットカーソルあり"
mes "座標 " + rect(0) + "," + rect(1)
}
redraw 1
return
| |
|
2014/4/29(Tue) 14:31:52|NO.61752
>なたでさん
ありがとうございます!すごいです!なんと言っていいか分からないほどです。
しかし、僕の作ったエディタには反応してくれませんでした。(Footy2)
キャレットカーソルは取得してくれますが、選択範囲を取得してくれませんでした。
Footy 2 のみのようです。mesbox の内容は正しく取得してくれました。
何故でしょう?
|
|
2014/4/29(Tue) 15:04:01|NO.61753
>ヒラギノさん
選択範囲の内容を取得するためコピーの
ショートカットキーを利用しているのですが、
このコピー時にCtrl+Cの次のようなコマンドを
SendInputで連続で送るように実装しています。
1 Ctrl押下
2 C押下
3 C離す
4 Ctrl離す
連続で送っているためキーの情報を判断できていないかもしれません。
1つずつ送信時に時間の間隔をおけば、認識するかもしれません。
「m_pushKeyboard」のモジュールの部分を少し修正する必要があると思います。
違ってたらすみません。
|
|
2014/4/29(Tue) 15:18:48|NO.61754
>なたで さん
クリップボードに選択範囲を送っていたのですか!(なるほどです)
そのため、「クリップボード操作モジュール」があったのですね。
僕の作ったエディタは、getkey & iparam命令 で文字コードを調べ、Ctrl+C であれば、Footy2Copy命令 でクリップボードに文字を送っています。
Ctrl+C が入力されたことは確認できたので、Footy2Copy命令 に異常があるのかもしれません。
|
|
2014/4/29(Tue) 15:26:14|NO.61755
連投スミマセン。
http://rpen.blogspot.jp/2008/01/footy2.html
のサンプルにある
>// アクセラレータキーを使用
>// Footy2付属のC++サンプルとほぼ同等
と書いてある方(2番目)のサンプルでは、正しく取得できました。
1番目のサンプルでは、正しく取得できませんでした。
アクセラレータテーブルの作成をすれば解決するんだと思います。
|
|
2014/4/29(Tue) 15:52:43|NO.61756
>// アクセラレータキーを使用
>// Footy2付属のC++サンプルとほぼ同等
のサンプルを参考にして、僕の作ったエディタを作り直しましたが、
相変わらず取得してくれませんでした。
>アクセラレータテーブルの作成をすれば解決するんだと思います。
は間違いでした。
|
|
2014/4/29(Tue) 15:55:18|NO.61759
>ヒラギノさん
Ctrl押下とCtrl離しとの間で、
Sleepを入れるようにしました。
キーボード押下モジュールを下記のと交換してみて下さい。
// キーボード押下モジュール
#module "m_pushKeyboard"
#define VK_CONTROL 0x0011
#define VK_A 0x0041
#define VK_C 0x0043
#define VK_V 0x0056
#define VK_X 0x0058
#define INPUT_KEYBOARD 1
#define KEYEVENTF_KEYDOWN 0x0000
#define KEYEVENTF_EXTENDEDKEY 0x0001
#define KEYEVENTF_KEYUP 0x0002
#define KEYEVENTF_SCANCODE 0x0008
#define MAPVK_VK_TO_VSC 0
#define MAPVK_VSC_TO_VK 1
#define MAPVK_VK_TO_CHAR 2
#define SIZE_OF_INT 4
#define INPUT_KEYBOARD_LENGTH 7
#const INPUT_KEYBOARD_SIZE SIZE_OF_INT * INPUT_KEYBOARD_LENGTH
#define LENGTH_1 1
#define LENGTH_2 2
#enum type = 0
#enum dwVkAndWScan
#enum dwFlags
#deffunc setKeyboardInput int pKEYBDINPUT, int ski_vk_key, int ski_flags
dupptr SKI_KEYBDINPUT, pKEYBDINPUT, INPUT_KEYBOARD_SIZE, vartype("int")
MapVirtualKey ski_vk_key, MAPVK_VK_TO_VSC
scancode = stat
SKI_KEYBDINPUT.type = INPUT_KEYBOARD
SKI_KEYBDINPUT.dwVkAndWScan = scancode << 16
SKI_KEYBDINPUT.dwFlags = KEYEVENTF_SCANCODE | ski_flags
return
#deffunc setPushKeyboard var KEYBDINPUT, int ski_vk_key
sdim KEYBDINPUT, INPUT_KEYBOARD_SIZE * LENGTH_2
setKeyboardInput varptr(KEYBDINPUT) + INPUT_KEYBOARD_SIZE * 0, ski_vk_key, KEYEVENTF_KEYDOWN
setKeyboardInput varptr(KEYBDINPUT) + INPUT_KEYBOARD_SIZE * 1, ski_vk_key, KEYEVENTF_KEYUP
return
#deffunc setDownKeyboard var KEYBDINPUT, int ski_vk_key
sdim KEYBDINPUT, INPUT_KEYBOARD_SIZE * LENGTH_1
setKeyboardInput varptr(KEYBDINPUT), ski_vk_key, KEYEVENTF_KEYDOWN
return
#deffunc setUpKeyboard var KEYBDINPUT, int ski_vk_key
sdim KEYBDINPUT, INPUT_KEYBOARD_SIZE * LENGTH_1
setKeyboardInput varptr(KEYBDINPUT), ski_vk_key, KEYEVENTF_KEYUP
return
// 初期化
#deffunc initPushCopy
setPushKeyboard PUSH_A, VK_A
setPushKeyboard PUSH_C, VK_C
setPushKeyboard PUSH_V, VK_V
setPushKeyboard PUSH_X, VK_X
setDownKeyboard DOWN_CTRL, VK_CONTROL
setUpKeyboard UP_CTRL, VK_CONTROL
return
// コピー
#deffunc pushCopy
getkey is_push_ctrl, VK_CONTROL
if(is_push_ctrl == FALSE) {
SendInput LENGTH_1, varptr(DOWN_CTRL), INPUT_KEYBOARD_SIZE
Sleep 10
SendInput LENGTH_2, varptr(PUSH_C), INPUT_KEYBOARD_SIZE
Sleep 10
SendInput LENGTH_1, varptr(UP_CTRL), INPUT_KEYBOARD_SIZE
} else {
SendInput LENGTH_2, varptr(PUSH_C), INPUT_KEYBOARD_SIZE
}
return
#global
initPushCopy
| |
|
2014/4/29(Tue) 16:02:27|NO.61760
>なたでさん
できました!ありがとうございます!
|
|
2014/5/1(Thu) 18:29:50|NO.61803
>KA さん
僕の説明不足 & 勘違いです><
申し訳ありません><
|
|