private void doFish(Object state) { try { // 1 Cast fishing log.Debug("Cast fishing"); Input.Keyboard.ISendString send = new Input.Keyboard.User32_SendInput_VirtualKeycode(); send.SendString("1"); // 2 Find Bobber on screen Thread.Sleep(100); log.Debug("Try to find bobber."); Point hookPos = getHookPos(); log.Info($"Found bobber at {hookPos.ToString()}"); // 3 Listen for catch noise log.Debug("Start listening to audio output"); log.Debug("Get audio device"); // http://gigi.nullneuron.net/gigilabs/displaying-a-volume-meter-using-naudio/ MMDeviceEnumerator SndDevEnum = new MMDeviceEnumerator(); MMDevice SndDevice = SndDevEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); while (timerEnabled) { double volume = SndDevice.AudioMeterInformation.MasterPeakValue * 100; log.Verbose("Current volume is:" + volume); if (volume > 20) { log.Info("Catch detected!"); break; } Thread.Sleep(100); } // 4 Click on Bobber log.Info($"Click bobber at {hookPos.ToString()}"); new Input.Mouse.User32_MouseClick(new Input.Mouse.User32_MousePosition()).Left(hookPos); } catch (Exception e) { log.Error("Catching a fish failed", e); } }