通过Windows API 函数“HWND WindowFromPoint(POINT Point)”可以获取光标所在处的窗口的句柄。需要有一个触发消息来调用这个函数:比如按下键盘上的某个按键来触发这个函数调用。这是个简单的示范,能够模拟鼠标点击其他窗口的关闭按钮行为;要获得更完善的方案,可以给我私信。
具体 *** 作方法:运行程序,让后将鼠标指针移动至其他窗口之上,最好是在标题栏上;然后按下键盘上的任意按键(推荐按字母键)。
在VC++60“文件”菜单中,新建一个空的“Win32 AppLication”工程。然后新建一个cpp源文件,在源文件中写入如下代码:
#include <windowsh>LRESULT CALLBACK WindowProc(HWND hdl_wnd, UINT msg_code, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASS wndcls;
wndclscbClsExtra = 0;
wndclscbWndExtra = 0;
wndclshbrBackground = (HBRUSH)COLOR_BTNSHADOW;
wndclshCursor = ::LoadCursor(NULL, IDC_ARROW);
wndclshIcon = ::LoadIcon(NULL, IDI_APPLICATION);
wndclshInstance = hInstance;
wndclslpfnWndProc = WindowProc;
wndclslpszClassName = "gethandle";
wndclslpszMenuName = NULL;
wndclsstyle = CS_VREDRAW | CS_HREDRAW;
::RegisterClass(&wndcls);
::CreateWindow("gethandle", "获取窗口句柄", WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, 200, 120, 400, 300, NULL, NULL, hInstance, 0);
MSG msg;
while (::GetMessage(&msg, NULL, 0, 0))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
return 1;
}
LRESULT CALLBACK WindowProc(HWND hdl_wnd, UINT msg_code, WPARAM wParam, LPARAM lParam)
{
LRESULT value = 0;
switch (msg_code)
{
case WM_CLOSE:
::PostQuitMessage(WM_QUIT);
break;
//注意:必须在本窗口获得键盘输入焦点的时候,WM_KEYDOWN消息才能生效!
//如果想在本窗口没有焦点的时候都能生效,则需要安装全局的键盘钩子。
case WM_KEYDOWN:
{
POINT pt;
HWND hdl_other;
::GetCursorPos(&pt); //获取鼠标指针的坐标
hdl_other = ::WindowFromPoint(pt); //将该坐标传递给获取句柄的函数
::PostMessage(hdl_other, WM_CLOSE, 0, 0); //用获取到的句柄,向目标窗口发送一个WM_CLOSE消息。WM_CLOSE消息相当于用户点击了窗口右上角的关闭按钮。
}
break;
default:
return ::DefWindowProc(hdl_wnd, msg_code, wParam, lParam);
}
return value;
}
在很多的编辑软件中有这样一个功能,即当用户在编辑区中输入字符或者按动鼠标使得光标的位置改变时,在编辑软件下方的状态栏中就能显示出光标所在位置的行和列的值。下面就介绍如何用VB编程实现在文本框中的这一功能。
首先,在Form中添加一个文本框(TextBox),将其MultiLine属性设置为True,以便输入多行文本;再在Form中添加两个标题栏(Label),以便显示光标位置;然后,在Form的代码窗口中添加程序中的代码。
Option Explici
Const EM_GETSEL = &HB0
Const EM_LINEFROMCHAR = &HC9
Const EM_LINEINDEX = &HBB
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Sub GetCaretPos(ByVal TextHwnd As Long, LineNo As Long, ColNo As Long)
Dim I As Long, j As Long
Dim lParam As Long, wParam As Long
Dim k As Long
'首先向文本框传递EM_GETSEL消息以获取从起始位置到
'光标所在位置的字符数
I = SendMessage(TextHwnd, EM_GETSEL, wParam, lParam)
j = I / 2 ^ 16
'再向文本框传递EM_LINEFROMCHAR消息根据获得的字符
'数确定光标以获取所在行数
LineNo = SendMessage(TextHwnd, EM_LINEFROMCHAR, j, 0)
LineNo = LineNo + 1
'向文本框传递EM_LINEINDEX消息以获取所在列数
k = SendMessage(TextHwnd, EM_LINEINDEX, -1, 0)
ColNo = j - k + 1
End Sub
Private Sub Form_Load()
Dim LineNo As Long, ColNo As Long
Call GetCaretPos(Text1hwnd, LineNo, ColNo)
Label1Caption = LineNo
Label2Caption = ColNo
End Sub
Private Sub Form_Resize()
Text1Width = MeScaleWidth
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Dim LineNo As Long, ColNo As Long
Call GetCaretPos(Text1hwnd, LineNo, ColNo)
Label1Caption = LineNo
Label2Caption = ColNo
End Sub
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim LineNo As Long, ColNo As Long
Call GetCaretPos(Text1hwnd, LineNo, ColNo)
Label1Caption = LineNo
Label2Caption = ColNo
End Sub
(程序)
运行上面的程序,在TextBox中输入字符或者按控制键来移动光标时,你可以看到屏幕下面的Label中就能显示出的光标所在的位置。以上程序在Win 95,VB 50下运行通过。
不是程序本事说明已经在程序之外了,那就要调用系统的API来获取鼠标位置了。
[DllImport("user32dll")]
internal
static
extern
bool
GetCursorPos(out
Point
lpPoint);
想获取坐标的时候就调用:
Point
mouserPoint
=
new
Point();
GetCurosoPos(out
mouserPoint);
这样鼠标的坐标就存在mouserPoint变量里了
还有一个土办法,就是把你的程序界面全透明,最大化,然后鼠标移动在屏幕其实就是在你的程序里面移动,鼠标点击的时候让程序最小化,使后面的元素能接收到事件就行了。
方法有很多,关键要多想。
this指针存放在主线程的堆栈中,传递到子线程的指针访问的其实是子线程的堆栈,当然不可能获得正确值,其实你直接传递光标坐标即可。在子线程对界面进行处理,会导致线程频繁切换,反而影响效率。
首先要实现输入内容不同颜色是可以实现的,比如使用一个可编辑iframe就可以了,textarea是不行的。
至于功能的实现,我觉得不需要获取结束位置。
首先检测鼠标事件,如果有点击编辑区的某个位置,你就获取当前鼠标的落点,然后用innerHTML加入一对标签,<span class="color:#XXXXXX"></span>,所有输入内容都在这个span中间。效果就是输入的所有文字都变色。
不知道楼主明白没?
importjavaawt;importjavaapplet;importjavaawtevent;publicclassUseTextEventextendsAppletimplementsActionListener,TextListener{TextFieldt1;TextAreat2;Panelp1;publicvoidinit(){t1=newTextField(25);t2=newTextArea(10,25);t1addActionListener(this);t1addTextListener(this);p1=newPanel(newBorderLayout());p1add(t1,BorderLayoutNORTH);p1add(t2,BorderLayoutSOUTH);add(p1);}publicvoidtextValueChanged(TextEventt){if(tgetSource()==t1){t1setText(t1getText());t1setCaretPosition(t1getText()length());//设置输入后的长度t2setText(t1getText());}}publicvoidactionPerformed(ActionEvente){if(egetSource()==t1)t2setText("");}}这个可以使光标放在文字的后面,但是光标还是会闪动,不稳定。
以上就是关于C++获取光标所在位置的句柄,并向光标处发送数据,用PostMessage(),要详细代码。全部的内容,包括:C++获取光标所在位置的句柄,并向光标处发送数据,用PostMessage(),要详细代码。、VB 如何获得TextBox的当前光标位置、C# winform 怎么获取闪烁光标的位置坐标不是程序本身的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)