Position des blinkenden Cursors?
-
Wenn man in einem Textverarbeitungsprogramm einen Text eingibt, dann gibt es doch diesen blinkenden Cursor (nicht der Maus Zeiger) - kann man irgendwie die Position dieses Cursors in Bildschirmkoordinaten ermitteln?
-
Hi,
Also das Teil heisst Caret, wenns ein edit control ist kann man zumindest die position im edit control mit EM_GETSEL glaub ich holen, und zumindest bei richedit gibts auch direkt eine message die die koordinaten liefert, such mal in der msdn nach caret und schau was du so findest
-
Hierfür gibts eine API-Funktion: GetCaretPos. Doku siehe MSDN.
-
In der MSDN steht:
"The caret position is always given in the client coordinates of the window that contains the caret."
ich brauche aber die Position des Caret relativ zur linken, oberen Ecke. z. b. möchte ich feststellen an welcher Position der Caret gerade in MS Word, in der Konsole oder sonst irgendeinem Textfeld befindet ohne näheres darüber zu wissen in welchen Feld sich er sich genau befindet
ich hab nicht selber einen Caret programmiert von dem ich jetzt wissen will wo er sich befindet, sondern ich will von fremden Anwendungen ausspionieren wo sich gerade der Caret befindet
-
Dann kannst du es mit ClientToScreen versuchen.
Das rechnet dir Fensterkoordinaten in Desktopkoordinaten um.
-
hab folgendes versucht:
POINT Point; GetCaretPos(&Point); cout<<Point.x<<endl; cout<<Point.y<<endl;gibt mir immer 0,0 aus - egal ob der Caret gerade in Notpade, Word oder in der Konsole blinkt
-
Das liegt daran, dass GetCaretPos immer nur im eigenen Prozess funktioniert.
Willst du Infos über einen anderen Thread/Prozess, dann schau dir malBOOL GetGUIThreadInfo( DWORD idThread, // thread identifier LPGUITHREADINFO lpgui // thread information );an. Damit funktionierts bei mir.
for( ;; ) { HWND hWnd = ::GetForegroundWindow(); if ( hWnd!=NULL ) { DWORD dwThread = GetWindowThreadProcessId( hWnd, NULL ); GUITHREADINFO ti; ZeroMemory( &ti, sizeof(GUITHREADINFO) ); ti.cbSize = sizeof(GUITHREADINFO); if ( GetGUIThreadInfo( dwThread, &ti ) ) { cout << "Caret at ( " << ti.rcCaret.left << ", " << ti.rcCaret.top << " )" << endl; } } }
-
werds mal testen - gibts auch eine möglichkeit herauszufindne wie groß bzw. Hoch dieser Blinkende Cursor - sorry Caret ist?
-
oh - hab gerade festgestellt, dass das ein Rect ist und ich daraus die Größe des Carets schon habe...
-
Habs mit der Konsole, dem MS Editor und mit MS Word getestet
Konsole: geht
MS Editor: geht
MS Word: geht nichtIn MS Word wird mir immer die linke obere Ecke des Client Bereiches zurückgegeben
#include <iostream> #include <windows.h> using namespace std; int main() { cout<<"Hallo!"<<endl; for( ;; ) { HWND hWnd = ::GetForegroundWindow(); if ( hWnd!=NULL ) { DWORD dwThread = GetWindowThreadProcessId( hWnd, NULL ); GUITHREADINFO ti; ZeroMemory( &ti, sizeof(GUITHREADINFO) ); ti.cbSize = sizeof(GUITHREADINFO); POINT Point; if ( GetGUIThreadInfo( dwThread, &ti ) ) { // cout << "Caret at ( " << ti.rcCaret.left << ", " << ti.rcCaret.top << " )" << endl; Point.x = ti.rcCaret.left; Point.y = ti.rcCaret.top; ClientToScreen(GetForegroundWindow(), &Point); } system("cls"); cout<<Point.x<<endl; cout<<Point.y<<endl; int CaretHeight = ti.rcCaret.bottom - ti.rcCaret.top; cout<<"CaretHeight"<<CaretHeight<<endl; } Sleep(500); } system("pause"); }hat jemand vielleicht noch eine Idee wie ich die Position des Caret in MS Word herausfinde?
-
Kanns sein, dass du das falsche Fenster bei Word erwischt, weil es MDI benützt?
MfG SideWinder
-
vielleicht benutzt word gar kein caret aus der api sondern macht es selbst.
-
vielleicht benutzt word gar kein caret aus der api sondern macht es selbst.
das hab ich mir als erstes auch gedacht
Kanns sein, dass du das falsche Fenster bei Word erwischt, weil es MDI benützt?
kann sein - fragt sich jetzt nur wie ich das "Dokument" Fenster erwische - mmh...