Anda mungkin ingin memberikan lebih banyak informasi sehingga Anda bisa mendapatkan jawaban yang bermanfaat.
Andy
36
Kiat: Jika judul Anda sama dengan pertanyaan Anda, maka judulnya terlalu panjang atau pertanyaannya terlalu pendek. Dalam hal ini yang terakhir, Anda harus memberikan lebih banyak konteks bagi siapa pun untuk memiliki kesempatan yang masuk akal untuk memberikan jawaban yang berguna.
Guffa
Jawaban:
145
Saya telah menggabungkan beberapa sumber untuk menghasilkan kode di bawah ini, yang saat ini saya gunakan. Saya juga telah menghapus referensi Windows.Forms sehingga saya dapat menggunakannya dari aplikasi konsol dan WPF tanpa referensi tambahan.
using System;
using System.Runtime.InteropServices;publicclassMouseOperations{[Flags]publicenumMouseEventFlags{LeftDown=0x00000002,LeftUp=0x00000004,MiddleDown=0x00000020,MiddleUp=0x00000040,Move=0x00000001,Absolute=0x00008000,RightDown=0x00000008,RightUp=0x00000010}[DllImport("user32.dll",EntryPoint="SetCursorPos")][return:MarshalAs(UnmanagedType.Bool)]privatestaticexternboolSetCursorPos(int x,int y);[DllImport("user32.dll")][return:MarshalAs(UnmanagedType.Bool)]privatestaticexternboolGetCursorPos(outMousePoint lpMousePoint);[DllImport("user32.dll")]privatestaticexternvoid mouse_event(int dwFlags,int dx,int dy,int dwData,int dwExtraInfo);publicstaticvoidSetCursorPosition(int x,int y){SetCursorPos(x, y);}publicstaticvoidSetCursorPosition(MousePoint point){SetCursorPos(point.X, point.Y);}publicstaticMousePointGetCursorPosition(){MousePoint currentMousePoint;var gotPoint =GetCursorPos(out currentMousePoint);if(!gotPoint){ currentMousePoint =newMousePoint(0,0);}return currentMousePoint;}publicstaticvoidMouseEvent(MouseEventFlagsvalue){MousePoint position =GetCursorPosition();
mouse_event((int)value,
position.X,
position.Y,0,0);}[StructLayout(LayoutKind.Sequential)]publicstructMousePoint{publicint X;publicint Y;publicMousePoint(int x,int y){
X = x;
Y = y;}}}
Saya tidak dapat melihat keuntungan dari kode sumber panjang ini dibandingkan dengan apa yang diposting Marcos Placona 17 bulan lalu.
Al Kepp
46
Mengingat ketidakjelasan pertanyaan, saya pikir orang mungkin mendapat manfaat dari contoh yang memungkinkan mereka untuk melakukan lebih dari sekadar klik kiri menyedot klik kanan atau tengah atau mengizinkan klik dan seret.
Keith
2
Bagus sekali. Saya datang ke sini mencari sesuatu seperti ini
CSharpie
Inilah yang saya cari, tetapi bagaimana Anda mengklik ke bawah, memindahkan mouse ke tempat lain dan kemudian melepaskan ??
ninjaxelite
1
@ninjaxelite Saya kira Anda mengirim 1. SetCursorPos, 2. MouseEvent(LeftButtonDown), 3. SetCursorPos, 4. MouseEvent(LeftButtonUp). Secara potensial membungkusnya dalam metode pembantu
Michal Ciechan
137
Contoh saya menemukan suatu tempat di sini di masa lalu. Mungkin bisa membantu:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;publicclassForm1:Form{[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternvoid mouse_event(uint dwFlags,uint dx,uint dy,uint cButtons,uint dwExtraInfo);//Mouse actionsprivateconstint MOUSEEVENTF_LEFTDOWN =0x02;privateconstint MOUSEEVENTF_LEFTUP =0x04;privateconstint MOUSEEVENTF_RIGHTDOWN =0x08;privateconstint MOUSEEVENTF_RIGHTUP =0x10;publicForm1(){}publicvoidDoMouseClick(){//Call the imported function with the cursor's current positionuint X =(uint)Cursor.Position.X;uint Y =(uint)Cursor.Position.Y;
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y,0,0);}//...other code needed for the application}
Permainan yang bagus. Menambahkan referensi ke jawaban asli
Marcos Placona
2
Saya mendapatkan pesan kesalahan dengan kode ini: Panggilan ke fungsi PInvoke 'MyForm! MyForm.Form1 :: mouse_event' telah membuat tumpukan tidak seimbang. Ini mungkin karena tanda tangan PInvoke yang dikelola tidak cocok dengan tanda tangan target yang tidak dikelola. Periksa bahwa konvensi panggilan dan parameter tanda tangan PInvoke cocok dengan target tanda tangan yang tidak dikelola. Ada ide?
Abdulla
12
Anda harus memberikan X dan Y ke uints.
Dibesjr
1
Bekerja dengan sempurna membutuhkan beberapa perubahan dalam posisi kursor sesuai persyaratan ...
Anurag Rabadia
14
Beberapa kontrol, seperti Tombol di System.Windows.Forms, memiliki metode "PerformClick" untuk melakukan hal itu.
Jika kontrol tidak memiliki metode PerformClick, Anda dapat memperluas / menambahkan satu, hanya perlu memanggil OnMouseClick dengan argumen MouseEventArgs yang sesuai.
Agak aneh bahwa ini diisolasi dalam namespace pengujian Visual Studio UI, tapi saya akan mengambil alih PInvoke setiap hari bahwa saya tidak perlu menyaring acara dengan perangkat.
kayleeFrye_onDeck
2
Sepertinya edisi Visual Studio Community tidak disertakan dengan DLL ini.
CM
2
Saya hanya menghabiskan waktu satu jam untuk mencoba agar ini berfungsi dengan menyalin DLL dari proyek "tes UI berkode" ke proyek lain dan kecuali jika Anda menggunakan jenis proyek "tes berkode UI", saran saya adalah: jangan repot-repot. Bahkan ketika saya menyalin semua DLL yang diperlukan itu melempar InvalidUITestExtensionPackageException, jadi sepertinya sangat cerewet menjalankan dalam jenis proyek tertentu, sayangnya.
Jez
@ Jo - Berguna untuk tahu, terima kasih. Belum melihat masalah apa pun, tapi sekarang saya setidaknya tahu ada; 0)
Rusty Nail
5
Saya telah mencoba kode yang diposting Marcos dan tidak berhasil untuk saya. Apa pun yang saya diberikan pada koordinat Y, kursor tidak bergerak pada sumbu Y. Kode di bawah ini akan berfungsi jika Anda ingin posisi kursor relatif ke sudut kiri desktop Anda, bukan relatif terhadap aplikasi Anda.
[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternvoid mouse_event(long dwFlags,long dx,long dy,long cButtons,long dwExtraInfo);privateconstint MOUSEEVENTF_LEFTDOWN =0x02;privateconstint MOUSEEVENTF_LEFTUP =0x04;privateconstint MOUSEEVENTF_MOVE =0x0001;publicvoidDoMouseClick(){
X =Cursor.Position.X;
Y =Cursor.Position.Y;//move to coordinates
pt =(Point)pc.ConvertFromString(X +","+ Y);Cursor.Position= pt;//perform click
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);}
Saya hanya menggunakan fungsi mouse_event untuk benar-benar melakukan klik. Anda dapat memberi X dan Y koordinat apa yang Anda inginkan, saya menggunakan nilai dari kotak teks:
X =Convert.ToInt32(tbX.Text);
Y =Convert.ToInt32(tbY.Text);
ini adalah yang tepat untuk saya, pada dasarnya Cursor.Positioncukup baik untuk memposisikan kursor mouse ke mana pun Anda inginkan, lalu gunakan WIN32API untuk melakukan klik yang sebenarnya.
Ge Rong
0
mereka adalah beberapa kebutuhan saya tidak bisa melihat ke kubah hal seperti Keith atau Marcos Placona lakukan daripada hanya melakukan
using System;
using System.Windows.Forms;
namespace WFsimulateMouseClick{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidForm1_Load(object sender,EventArgs e){
button1_Click(button1,newMouseEventArgs(System.Windows.Forms.MouseButtons.Left,1,1,1,1));//by the way//button1.PerformClick();// and//button1_Click(button1, new EventArgs());// are the same}privatevoid button1_Click(object sender,EventArgs e){MessageBox.Show("clicked");}}}
Anda juga dapat melakukan button1_Klik (null, null) jika Anda tidak membutuhkan salah satu dari parameter tersebut.
sab669
@ sab669 tentu tetapi masih tergantung pada kebutuhannya :-)
WiiMaxx
Anda tidak boleh menggunakan nulldalam parameter kedua, itu akan membuang NullReferenceException, alih-alih gunakanEventArgs.Empty
Etor Madiv
1
@ EtorMadiv seperti yang saya katakan sebelumnya tergantung pada apa yang Anda coba lakukan ..., karena jika Anda menggunakannya seperti yang saya lakukan di atas, Anda tidak akan mendapatkanNullReferenceException
Jawaban:
Saya telah menggabungkan beberapa sumber untuk menghasilkan kode di bawah ini, yang saat ini saya gunakan. Saya juga telah menghapus referensi Windows.Forms sehingga saya dapat menggunakannya dari aplikasi konsol dan WPF tanpa referensi tambahan.
sumber
1. SetCursorPos, 2. MouseEvent(LeftButtonDown), 3. SetCursorPos, 4. MouseEvent(LeftButtonUp)
. Secara potensial membungkusnya dalam metode pembantuContoh saya menemukan
suatu tempatdi sini di masa lalu. Mungkin bisa membantu:sumber
Beberapa kontrol, seperti Tombol di System.Windows.Forms, memiliki metode "PerformClick" untuk melakukan hal itu.
sumber
Microsoft.VisualStudio.TestTools.UITesting
sumber
InvalidUITestExtensionPackageException
, jadi sepertinya sangat cerewet menjalankan dalam jenis proyek tertentu, sayangnya.Saya telah mencoba kode yang diposting Marcos dan tidak berhasil untuk saya. Apa pun yang saya diberikan pada koordinat Y, kursor tidak bergerak pada sumbu Y. Kode di bawah ini akan berfungsi jika Anda ingin posisi kursor relatif ke sudut kiri desktop Anda, bukan relatif terhadap aplikasi Anda.
Saya hanya menggunakan fungsi mouse_event untuk benar-benar melakukan klik. Anda dapat memberi X dan Y koordinat apa yang Anda inginkan, saya menggunakan nilai dari kotak teks:
sumber
Cursor.Position
cukup baik untuk memposisikan kursor mouse ke mana pun Anda inginkan, lalu gunakan WIN32API untuk melakukan klik yang sebenarnya.mereka adalah beberapa kebutuhan saya tidak bisa melihat ke kubah hal seperti Keith atau Marcos Placona lakukan daripada hanya melakukan
sumber
null
dalam parameter kedua, itu akan membuangNullReferenceException
, alih-alih gunakanEventArgs.Empty
NullReferenceException