C 獲得游標在螢幕中的位置並在位置處輸入指定文字

2022-10-08 19:48:17 字數 4015 閱讀 8371

實現目標:c#獲得游標在螢幕中的位置並在位置處輸入指定文字。

實現示例:滑鼠游標定位到winform軟體的任意輸入位置,按f1快捷鍵快速輸入當前時間。

實現思路:(1)首先監聽f1鍵盤按下事件;(2)獲取前台視窗的控制代碼;檢索建立視窗的執行緒資訊;傳送訊息。

程式型別:winform

實現過程

首先,定義兩個幫助類,乙個是鍵盤監聽事件類keyboardhook,乙個是傳送訊息類sendmsg。

keyboardhook:

using system;

using system.collections.generic;

using system.linq;

using system.runtime.interopservices;

using system.text;

using system.threading.tasks;

using system.windows.forms;

namespace helper

//使用此功能,安裝了乙個鉤子

[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.stdcall)]

public static extern int setwindowshookex(int idhook, hookproc lpfn, intptr hinstance, int threadid);

//呼叫此函式解除安裝鉤子

[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.stdcall)]

public static extern bool unhookwindowshookex(int idhook);

//使用此功能,通過資訊鉤子繼續下乙個鉤子

[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.stdcall)]

public static extern int callnexthookex(int idhook, int ncode, int32 wparam, intptr lparam);

// 取得當前執行緒編號(執行緒鉤子需要用到)

[dllimport("kernel32.dll")]

static extern int getcurrentthreadid();

//使用windows api函式代替獲取當前例項的函式,防止鉤子失效

[dllimport("kernel32.dll")]

public static extern intptr getmodulehandle(string name);

public void start()}}

public void stop()

if (!(retkeyboard)) throw new exception("解除安裝鉤子失敗!");

}//toascii職能的轉換指定的虛擬鍵碼和鍵盤狀態的相應字元或字元

[dllimport("user32")]

public static extern int toascii(int uvirtkey, //[in] 指定虛擬關鍵**進行翻譯。

int uscancode, // [in] 指定的硬體掃瞄碼的關鍵須翻譯成英文。高階位的這個值設定的關鍵,如果是(不壓)

byte lpbkeystate, // [in] 指標,以256位元組陣列,包含當前鍵盤的狀態。每個元素(位元組)的陣列包含狀態的乙個關鍵。如果高階位的位元組是一套,關鍵是**(按下)。在低位元,如果設定表明,關鍵是對切換。在此功能,只有肘位的caps lock鍵是相關的。在切換狀態的num個鎖和滾動鎖定鍵被忽略。

byte lpwtranskey, // [out] 指標的緩衝區收到翻譯字元或字元。

int fustate); // [in] specifies whether a menu is active. this parameter must be 1 if a menu is active, or 0 otherwise.

//獲取按鍵的狀態

[dllimport("user32")]

public static extern int getkeyboardstate(byte pbkeystate);

[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.stdcall)]

private static extern short getkeystate(int vkey);

private const int wm_keydown = 0x100;//keydown

private const int wm_keyup = 0x101;//keyup

private const int wm_syskeydown = 0x104;//syskeydown

private const int wm_syskeyup = 0x105;//syskeyup

private int keyboardhookproc(int ncode, int32 wparam, intptr lparam)

//鍵盤按下

if (keypressevent != null && wparam == wm_keydown)

}// 鍵盤抬起

if (keyupevent != null && (wparam == wm_keyup || wparam == wm_syskeyup))

}//如果返回1,則結束訊息,這個訊息到此為止,不再傳遞。

//如果返回0或呼叫callnexthookex函式則訊息出了這個鉤子繼續往下傳遞,也就是傳給訊息真正的接受者

return callnexthookex(hkeyboardhook, ncode, wparam, lparam);

}~keyboardhook()

}}

sendmsg:

using system;

using system.collections.generic;

using system.linq;

using system.runtime.interopservices;

using system.text;

using system.threading.tasks;

namespace helper

[structlayout(layoutkind.sequential)]

public struct rect

public guithreadinfo? getguithreadinfo(intptr hwnd)

return null;

}public void sendtext(string text)}}

}}

呼叫方法:

using helper;

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.threading.tasks;

using system.windows.forms;

private void k_hook_keydownevent(object sender, keyeventargs e)}}

}

此時,可以執行程式,進行測試了。

動態獲取當前螢幕中游標所在位置的顏色

using system using system.drawing using system.collections using system.componentmodel using system.windows.forms using system.data using system.drawi...

動態獲取當前螢幕中游標所在位置的顏色

using system using system.drawing using system.collections using system.componentmodel using system.windows.forms using system.data using system.drawi...

在C 中獲取文字框中游標所在位置

首先定義api函式 const intem getsel 0xb0 const intem linefromchar 0xc9 const intem lineindex 0xbb dllimport user32.dll entrypoint sendmessage public static e...