Bagaimana seseorang dapat menentukan, dalam kode, berapa lama mesin terkunci?
Ide lain di luar C # juga diterima.
Saya suka ide layanan windows (dan telah menerimanya) untuk kesederhanaan dan kebersihan, tapi sayangnya saya rasa itu tidak akan berhasil untuk saya dalam kasus khusus ini. Saya ingin menjalankan ini di tempat kerja saya di tempat kerja daripada di rumah (atau di samping rumah, saya kira), tetapi dikunci dengan cukup keras berkat DoD. Itu bagian dari alasan saya menggulung milik saya sendiri.
Saya akan tetap menulisnya dan melihat apakah berhasil. Terimakasih semuanya!
Saya akan membuat Layanan Windows (jenis proyek studio visual 2005) yang menangani acara OnSessionChange seperti yang ditunjukkan di bawah ini:
Apa dan bagaimana Anda mencatat aktivitas pada saat itu terserah Anda, tetapi Layanan Windows menyediakan akses cepat dan mudah ke acara windows seperti startup, shutdown, login / out, bersama dengan acara kunci dan buka kunci.
sumber
Solusi di bawah ini menggunakan Win32 API. OnSessionLock dipanggil saat workstation dikunci, dan OnSessionUnlock dipanggil saat tidak terkunci.
sumber
Saya tahu ini adalah pertanyaan lama tetapi saya telah menemukan metode untuk mendapatkan Status Kunci untuk sesi tertentu.
Saya menemukan jawaban saya di sini tetapi itu dalam C ++ jadi saya menerjemahkan sebanyak yang saya bisa ke C # untuk mendapatkan Status Kunci.
Jadi begini:
Catatan: Kode di atas diekstrak dari proyek yang jauh lebih besar jadi jika saya melewatkan sedikit maaf. Saya tidak punya waktu untuk menguji kode di atas tetapi berencana untuk kembali dalam satu atau dua minggu untuk memeriksa semuanya. Saya hanya mempostingnya sekarang karena saya tidak ingin lupa melakukannya.
sumber
if (session_info_ex.Level != 1)
- jika kondisinya benar, memori tidak akan dibebaskan. 2. jika session_info_ex.Level! = 1 Anda tidak boleh melakukan ini:Marshal.PtrToStructure<WTSINFOEX>(ppBuffer);
karena ukuran buffer yang dikembalikan mungkin berbeda dari ukuran WTSINFOEXUInt32 Reserved;
melainkan Anda harus mendefinisikan strukturnya secaraWTSINFOEX_LEVEL1
lengkap. Dalam hal ini kompilator akan melakukan padding (pelurusan) yang benar dari bidang di dalam struktur. 4. FungsiWTSFreeMemoryEx
disalahgunakan di sini.WTSFreeMemory
harus digunakan sebagai gantinya.WTSFreeMemoryEx
dimaksudkan untuk membebaskan memori setelahWTSEnumerateSessionsEx
.CharSet = CharSet.Auto
harus digunakan di semua atribut.Jika Anda tertarik untuk menulis layanan windows untuk "menemukan" kejadian ini, topshelf (perpustakaan / kerangka kerja yang membuat layanan windows lebih mudah) memiliki pengait.
dan sekarang kode untuk memasang layanan rak atas ke antarmuka / beton di atas
Semua yang di bawah ini adalah penyetelan rak atas "khas" .... kecuali untuk 2 baris yang saya tandai sebagai
/ * INI ADALAH GARIS SIHIR * /
Itulah yang membuat metode SessionChanged diaktifkan.
Saya menguji ini dengan windows 10 x64. Saya mengunci dan membuka kunci mesin saya dan mendapatkan hasil yang diinginkan.
Package.config saya untuk memberikan petunjuk tentang versi:
sumber
x.EnableSessionChanged();
bersama denganServiceSessionChange
implementasi antarmuka jika Anda telah mengimplementasikanServiceControl
dan tidak membuat implikasi instance kelas layanan. Sukax.Service<ServiceImpl>();
. Anda harus menerapkanServiceSessionChange
diServiceImpl
kelas:class ServiceImpl : ServiceControl, ServiceSessionChange
CATATAN : Ini bukan jawaban, tapi (kontribusi) untuk jawaban Timothy Carter , karena reputasi saya tidak memungkinkan saya untuk berkomentar sejauh ini.
Seandainya seseorang mencoba kode dari jawaban Timothy Carter dan tidak langsung berhasil di layanan Windows, ada satu properti yang perlu disetel
true
di konstruktor layanan. Cukup tambahkan baris di konstruktor:Dan pastikan untuk tidak menyetel properti ini setelah layanan dimulai jika tidak
InvalidOperationException
akan terlempar.sumber
Di bawah ini adalah 100% kode kerja untuk mengetahui apakah PC terkunci atau tidak.
Sebelum menggunakan ini gunakan namespace
System.Runtime.InteropServices
.sumber