HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0426
ヒラギノ選択範囲の位置11解決


ヒラギノ

リンク

2014/4/26(Sat) 09:56:14|NO.61690

こんにちは。

http://sinack.com/mac/popclip.html
を見て同じようなことを再現しようと思い、SelectionStartというものを見つけましたが、
使い方が分かりません。また、この命令で合っているのかも分かりません。

教えてください。



この記事に返信する


KA

リンク

2014/4/26(Sat) 10:25:56|NO.61691

右クリックメニューで同等な物が出てきますが、
最初から表示させたいと言うことですか?



ヒラギノ

リンク

2014/4/27(Sun) 18:11:41|NO.61710

>KA さん
右クリックではなく、リアルタイムでメッセージボックスを監視して、文字が選択されたら、
ポップアップを表示したいです。

>最初から表示させたいと言うことですか?
http://sinack.com/wp-content/uploads/2013/01/a7d909831caca561200cd890c93e1141.png
の一番左上の画像のような風に、クリップボードに文字列があったら、ポップアップを表示したいです。



なたで

リンク

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 さん
僕の説明不足 & 勘違いです><
申し訳ありません><



ONION software Copyright 1997-2023(c) All rights reserved.